为什么在C++中未定义256个签名字符

cpr*_*gcr 2 c++ signed char

阅读C++ Primer第5版的书,我发现signed char有一个值256是未定义的.我决定尝试一下,我看到std::cout那个char变量不起作用.(没有印刷).

但在C,同样的事情 signed char c = 256; 会给出一个值0char c.

我试过搜索但没找到任何东西.

有人可以向我解释为什么在C++中会出现这种情况?

编辑:我知道256是2个字节,但为什么与C中的不一样,发生在C++上?

T.C*_*.C. 11

这本书非常不正确.没有未定义的行为

signed char c = 256;
Run Code Online (Sandbox Code Playgroud)

256是类型的整数文字int.signed char要用它初始化a ,它将被转换为signed char(§8.5[dcl.init] /17.8;所有引用都是N4140).此转换受§4.7[conv.integral]的约束:

1整数类型的prvalue可以转换为另一个整数类型的prvalue.可以将未范围的枚举类型的prvalue转换为整数类型的prvalue.

2如果目的地类型未签名,[...]

3如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改; 否则,该值是实现定义的.

如果signed char不能表示256,则转换产生类型的实现定义值,signed char然后用于初始化c.这里没有什么不明确的.


当人们说"签名溢出是UB"时,他们通常是指§5[expr]/p4中的规则:

如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义.

这样渲染UB表达式INT_MAX + 1- 操作数都是ints,因此结果的类型也是int,但是该值超出了可表示值的范围.此规则不适用于此,因为唯一的表达式是256,其类型为int,256显然在可表示值的范围内int.


Pub*_*bby 6

编辑:请参阅下面的TC答案.这样更好.

在C++和C中,有符号整数溢出是未定义的.在大多数实现中,最大值为signed char,SCHAR_MAX因此将256放入其中会溢出它.大多数情况下,您会看到数字只是环绕(到0),但这仍然是未定义的行为.