将等于369的字符设置为与113相同的二进制图案是UB行为
set a char equal to 369 give the same binary pattern than 113 is UB behavior?
众所周知,炭是8位,因此可以存储0到255,
如果我初始化了像369相似价值更高的字符,那么我得到的二进制图案比113即:MSVC12下的01110001
是标准的,还是未定义的行为?
请注意369 - 256 == 113
。
4.7积分转换,第2段&3:
如果目标类型未签名,则结果值是符合源整数一致的最小无符号整数(modulo 2^n,其中n是用于表示无符号类型的位数)。
如果目标类型已签名,则值在目标类型中表示(和位范围宽度),则值不变;否则,该值是实现定义的。
但是,char
是否表示与unsigned char
或signed char
相同。
因此,这种行为确实取决于编译器,尽管大多数都会以这种方式这样做。
按标准 char
大小不需要8位,可以签名或未签名,因此实现了定义。
c 11标准的报价:
3.9.1基本类型[basic.fundamental]
声明为字符(char)的对象应足够大以存储 实施基本角色集的任何成员。
...
是实施定义的char对象是否可以容纳负值。
它溢出。369-256 = 113。
char
不一定是8位。根据平台,它可以是任意数量的位。即使在您的平台上char
是8位类型,也不意味着它的范围为0..255
。可以签署类型,这意味着其范围将是-128..+127
(假设2的补体表示)。
如果在您的平台类型char上恰好是8位并且未签名,则可以保证此行为。未签名的整数类型遵循模量算术的规则。369
保证被截断为Modulo 256
并产生113
。
如果在您的平台类型char上是8位并签名,则该行为是实现定义的。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- 正在尝试重载二进制搜索树分配运算符
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 带有数组键C++的二进制映射
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 二进制数之和(使用C样式字符串)
- 如何从dicom文件中读取二进制数据
- 将等于369的字符设置为与113相同的二进制图案是UB行为