已签名字符的整数转换

时间:2017-02-23 12:03:09

标签: c++ type-conversion

TCPL 3rd Edition,C.6.2.1 Integral Conversions给出了以下示例:

signed char c = 1023; // implementation defined
  

合理的结果是255和-1 C.3.4

如果目标机器使用2s补码,获得-1选项。

'签名的实施方式'会导致255?

2 个答案:

答案 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]
  ...

     
      
  1. 如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改;   否则,该值是实现定义的。
  2.