2

众所周知,一个 char 是 8 位的,所以它可以存储从 0 到 255 的值,

如果我用更大的值(如 369)初始化一个字符,我会得到与 113 相同的二进制模式,即 MSVC12 下的 01110001

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

4

4 回答 4

5

请注意369 - 256 == 113.

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

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

如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的。

但是是否char意味着相同unsigned charsigned char也是实现定义的。

所以这种行为确实取决于编译器,尽管大多数人会这样做。

于 2012-10-29T13:22:30.633 回答
3

按标准char大小,8 位不是必需的,可以是有符号或无符号的,因此它是实现定义的。

引用 C++11 标准:

3.9.1 基本类型[basic.fundamental]

声明为字符 (char) 的对象应足够大以存储实现的基本字符集的任何成员。

...

char 对象是否可以保存负值是实现定义的。

于 2012-10-29T13:29:39.420 回答
2

它溢出了。369 - 256 = 113。

于 2012-10-29T13:19:39.343 回答
2

Achar不一定是 8 位。它可以是任意数量的位,具体取决于平台。即使在你的平台上char是 8 位类型,也并不意味着它的范围是0..255. 类型可以带符号,这意味着它的范围将是-128..+127(假设 2 的补码表示)。

如果在您的平台上类型 char 恰好是 8 位且无符号,那么这种行为是有保证的。无符号整数类型遵循模运算规则。369保证被截断模256并产生113.

如果在您的平台上类型 char 是 8 位且有符号,则行为是实现定义的。

于 2012-10-29T13:26:49.887 回答