繁体   English   中英

char c = 255的值转换为int

[英]Value of char c = 255 converted to int

我的问题是关于Stroustrup的C ++编程语言第4版中的一个段落。 他带来了一个例子

char c = 255; // 255 is ‘‘all ones,’ ’ hexadecimal 0xFF
int i = c;

并解释如何在char签名或未签名的机器上进行转换。

我的价值是什么? 不幸的是,答案是不确定的。 在具有8位字节的实现上,答案取决于扩展为int时“全部”字符位模式的含义。 在char未签名的机器上,答案是255.在签名char的机器上,答案是-1。

我的问题是它为什么会是-1,它不取决于机器上使用二进制数的表示形式? 它是不是0(-0)如果它使用1的补码而-1如果是2的补码?

引用C ++ 03 4.7 / 3:

如果目标类型已签名,则如果可以在目标类型(和位字段宽度)中表示该值,则该值不会更改; 否则,该值是实现定义的。

假设字节是8位,这意味着理论上你得到以下之一:

  • -127如果签名大小的计算机。
  • -0如果一个人的补充计算机。
  • -1如果两个补充计算机。

前两者几乎不存在于现实世界中。

(在char为8位类型的情况下)255不是可表示的值。 将不可表示的值转换为有符号的类型会导致实现定义的值(直到C ++ 20)。 所以,Stroustrup在这一步骤中简化了一点; 就标准而言,结果可能是这种情况下的任何结果。

但假设符号表示是二进制补码,则该值很可能与255模2 8一致 (在未来的C ++ 20标准中,这将成为一种保证)。 与255 modulo 2 8一致并且可表示的值为-1

如果它使用的是补码,它不会是0(-0)

可能(直到C ++ 20)。 但是那些补充是古老的,几乎不再使用了。 因此,正如我所说,似乎Stroustrup似乎选择简化解释并假设两个补码。 或者也许他在写作时心中有未来的标准; 或者也许标准的改变是为了让他的书正确:)

让我们看看文章签名号码表示

啊哈!

我们可以看到提到了5种类型的表示:

  • 无符号
  • 标志和幅度
  • 一个补充
  • 两个补码
  • 偏移二进制
  • 基地-2

(并且好奇 - 更多负面基础也可以使用)

让我们看一下4位数字的比较表

扩展到8位1我们看到:

  • 无符号= 255
  • 符号和幅度= -127
  • 一个补码= -0
  • 二的补码= -1
  • 超出-127 = 127
  • Base -2 = hm ......我需要考虑一下

所以Stroustrup是对的:

不幸的是,答案是不确定的。 在具有8位字节的实现上,答案取决于扩展为int时''all''char位模式的含义

但他并不完全正确:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM