转换如何运作?例如:char [-128,127]的范围,unsigned char [0,255]的范围
char x = -128;
unsigned char y = static_cast<unsigned char>(x);
cout<<y; //128
Run Code Online (Sandbox Code Playgroud)
为什么不是0?
无符号算术(包括从有符号类型的转换)是模块化的,模数为2 n(其中n
是位数).
假设char
有8位,则-128与128一致,模256; 这是转换的结果.
更新:如注释中所述,这假定-128是类型的有效值char
,但不一定是这种情况.char
有一系列的至少[0..127]
,和signed char
至少[-127..127]
.
无符号算术和无符号转换以2 N为模.你有一个8位字符,所以N是8,2 N是256.
-128和128是全等模256.
以下是4.7([conv.integral]
)节中的实际规则:
- 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 结束说明]
- 如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则该值不变; 否则,该值是实现定义的.