char c = 255的值转换为int

时间:2019-02-15 11:10:58

标签: c++ binary char signed

我的问题是关于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吗?

3 个答案:

答案 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种表示形式:

  • 未签名
  • 符号和大小
  • 补语
  • 补码
  • 偏移二进制
  • 基本−2

(出于好奇-也可以使用更多Negative base

让我们看看Comparison table中的4位数字。

扩展到1的8位,我们看到:

  • 未签名= 255
  • 符号和大小= -127
  • 一个人的补语= -0
  • 二进制补码= -1
  • Excess-127 = 127
  • Base −2 = hm ...我需要考虑一下

Stroustrup就在:

  

不幸的是,答案是不确定的。在使用8位字节的实现中,答案取决于扩展为int时“所有”字符位模式的含义

但是他并不完全正确:

  

在未签名的机器上,答案是255。在已签名的机器上,答案是-1。