转换如何运作?例如: char的范围[-128,127], unsigned char的范围[0,255]
char x = -128;
unsigned char y = static_cast<unsigned char>(x);
cout<<y; //128
为什么不是0?
答案 0 :(得分:6)
无符号算术,包括从带符号类型的转换,是模块化的,模数为2 n (其中n
是位数)。
假设char
有8位,则-128与128一致,模256;所以这是转换的结果。
更新:如评论中所述,这假定-128是类型char
的有效值,但不一定如此。 char
的范围至少为[0..127]
,signed char
至少为[-127..127]
。
答案 1 :(得分:5)
无符号算术和无符号转换以模2 N 进行。你有一个8位字符,所以N是8,而2 N 是256。
-128和128是全等模256。
以下是4.7节([conv.integral]
)中的实际规则:
- 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n 其中n是用于表示无符号类型的位数)。 [注意:在两个 补码表示,这种转换是概念性的,并且位模式没有变化(如果有的话) 不是截断)。 - 尾注]
- 如果目标类型已签名,则该值不会更改,如果它可以在目标类型中表示(和 比特场宽度);否则,该值是实现定义的。
答案 2 :(得分:1)
转换的工作原理是以不同的方式重新解释相同的位模式,而不是通过添加+128来偏置范围。阅读two's complement了解更多信息。