将等于369的字符设置为与113相同的二进制图案是UB行为

set a char equal to 369 give the same binary pattern than 113 is UB behavior?

本文关键字:二进制 UB 行为 字符 设置      更新时间:2023-10-16

众所周知,炭是8位,因此可以存储0到255,

如果我初始化了像369相似价值更高的字符,那么我得到的二进制图案比113即:MSVC12下的01110001

是标准的,还是未定义的行为?

请注意369 - 256 == 113

4.7积分转换,第2段&3:

如果目标类型未签名,则结果值是符合源整数一致的最小无符号整数(modulo 2^n,其中n是用于表示无符号类型的位数)。

如果目标类型已签名,则值在目标类型中表示(和位范围宽度),则值不变;否则,该值是实现定义的。

但是,char是否表示与unsigned charsigned 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位并签名,则该行为是实现定义的。