将char转换为unsigned char

时间:2012-07-10 18:05:59

标签: c++

转换如何运作?例如: char的范围[-128,127], unsigned char的范围[0,255]

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

为什么不是0?

3 个答案:

答案 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了解更多信息。