我的问题是关于Stroustrup的书C ++编程语言,第4版中的一段。他举了一个例子
char c = 255; // 255 is ‘‘all ones,’ ’ hexadecimal 0xFF
int i = c;
以及在char为带符号或无符号的机器上如何转换的说明。
i的值是多少?不幸的是,答案是不确定的。在具有8位字节的实现中,答案取决于扩展为int时“所有”字符位模式的含义。在未签名的机器上,答案是255。在已签名的机器上,答案是-1。
我的问题是为什么它将为-1,这不取决于计算机上使用的二进制数表示形式吗?如果使用一个补码就不是0(-0),如果使用两个补码就不是-1吗?
答案 0 :(得分:4)
引用C ++ 03 4.7 / 3:
如果目标类型是带符号的,则该值可以用目标类型(和位域宽度)表示;否则,该值是实现定义的。
假设字节为8位,这意味着理论上您将获得以下其中之一:
-127
(如果是经过签名的幅度计算机)。-0
(如果是补充计算机)。-1
(如果是补码计算机)。前两个在现实世界中几乎不存在。
答案 1 :(得分:3)
(如果char
是带符号的8位类型)255不是可表示的值。将无法表示的值转换为带符号的类型会导致实现定义的值(直到C ++ 20)。因此,Stroustrup在此步骤中做了一些简化。就标准而言,在这种情况下结果可能是任何东西。
但是假设符号表示为二进制补码,则该值很可能与255模2 8 一致(在将来的C ++ 20标准中,这成为保证)。与255模2 8 一致且可表示的值是 -1 。
如果使用一个补码就不会是0(-0)
可能(直到C ++ 20)。但是那些人的补语是陈旧的,几乎不再使用。因此,正如我所说,似乎Stroustrup似乎已选择简化说明并假定两者互补。也许他在撰写本书时就牢记了未来的标准。或者也许是提出了标准更改以使他的书正确:)
答案 2 :(得分:0)
让我们看看文章Signed number representations。
啊哈!
我们可以看到提到了5种表示形式:
(出于好奇-也可以使用更多Negative base)
让我们看看Comparison table中的4位数字。
扩展到1
的8位,我们看到:
255
-127
-0
-1
127
Stroustrup就在:
不幸的是,答案是不确定的。在使用8位字节的实现中,答案取决于扩展为int时“所有”字符位模式的含义
但是他并不完全正确:
在未签名的机器上,答案是255。在已签名的机器上,答案是-1。