0

转换如何工作?例如:char[-128, 127] 的作用域,unsigned char[0, 255] 的作用域

char x = -128;
unsigned char y = static_cast<unsigned char>(x);
cout<<y; //128

为什么不是 0 ?

4

3 回答 3

6

无符号算术,包括从有符号类型的转换,是模块化的,模数为 2 n(其中n是位数)。

假设char有 8 位,则 -128 等于 128,模 256;所以这就是转换的结果。

更新:如评论中所述,这假设 -128 是 type 的有效值char,但不一定如此。char具有至少[0..127]signed char至少的范围[-127..127]

于 2012-07-10T18:10:30.173 回答
5

无符号算术和到无符号的转换以 2 N为模进行。你有一个 8 位字符,所以 N 是 8,而 2 N是 256。

-128 和 128 以 256 为模全等。

以下是第 4.7 节 ( [conv.integral]) 中的实际规则:

  • 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2 n 其中 n 是用于表示无符号类型的位数)。[ 注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。——尾注]
  • 如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则值不变;否则,该值是实现定义的。
于 2012-07-10T18:08:56.237 回答
1

转换通过以不同方式重新解释相同的位模式来工作,而不是通过添加 +128 来偏置范围。阅读二进制补码以了解更多信息。

于 2012-07-10T18:11:39.690 回答