众所周知,一个 char 是 8 位的,所以它可以存储从 0 到 255 的值,
如果我用更大的值(如 369)初始化一个字符,我会得到与 113 相同的二进制模式,即 MSVC12 下的 01110001
它是标准,还是未定义的行为?
请注意369 - 256 == 113
.
4.7 积分转换,第 2 和第 3 段:
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2^n,其中 n 是用于表示无符号类型的位数)。
如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的。
但是是否char
意味着相同unsigned char
或signed char
也是实现定义的。
所以这种行为确实取决于编译器,尽管大多数人会这样做。
按标准char
大小,8 位不是必需的,可以是有符号或无符号的,因此它是实现定义的。
引用 C++11 标准:
3.9.1 基本类型[basic.fundamental]
声明为字符 (char) 的对象应足够大以存储实现的基本字符集的任何成员。
...
char 对象是否可以保存负值是实现定义的。
它溢出了。369 - 256 = 113。
Achar
不一定是 8 位。它可以是任意数量的位,具体取决于平台。即使在你的平台上char
是 8 位类型,也并不意味着它的范围是0..255
. 类型可以带符号,这意味着它的范围将是-128..+127
(假设 2 的补码表示)。
如果在您的平台上类型 char 恰好是 8 位且无符号,那么这种行为是有保证的。无符号整数类型遵循模运算规则。369
保证被截断模256
并产生113
.
如果在您的平台上类型 char 是 8 位且有符号,则行为是实现定义的。