TCPL 3rd Edition,C.6.2.1 Integral Conversions给出了以下示例:
signed char c = 1023; // implementation defined
合理的结果是255和-1 C.3.4
如果目标机器使用2s补码,获得-1选项。
'签名的实施方式'会导致255?
答案 0 :(得分:0)
在这种情况下,编译器可以随心所欲地将静态初始化程序替换为= 255
。
但我想说,寻找这个问题的答案是编程C ++的错误方法。这本书教你如何使用C ++,而不是特定的计算机。符合标准的代码,您不会遇到任何问题。
答案 1 :(得分:0)
我很清楚我知道没有任何实现会导致255.这在理论上是可能的,但是对于一个带有255值的signed char,char类型应该至少有9位:数据值为8,符号为1
但是,当您将无法表示的值转换为有符号类型时,结果是依赖于实现的(*),因此对于任何大于它的整数值(即127),它可以合法地为MAX_CHAR。或者实现可以选择将不可接受的值转换为0。
无论如何,它与负值的表示无关。除了常见的实现使用2的补码并简单地保持最低位,以-1结尾。
但是,常见的实现方式是:
char c = 1023; // plausible values are -1 (default char is signed) or 255 (default unsigned)
(*)参考:
来自n4296草案的C ++ 14
4.7积分转换[conv.integral]
...
- 如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改; 否则,该值是实现定义的。
醇>