阅读C++ Primer第5版的书,我发现signed char有一个值256是未定义的.我决定尝试一下,我看到std::cout那个char变量不起作用.(没有印刷).
但在C,同样的事情
signed char c = 256;
会给出一个值0的char 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.
编辑:请参阅下面的TC答案.这样更好.
在C++和C中,有符号整数溢出是未定义的.在大多数实现中,最大值为signed char,SCHAR_MAX因此将256放入其中会溢出它.大多数情况下,您会看到数字只是环绕(到0),但这仍然是未定义的行为.