将char转换为unsigned char

Irb*_*bis 0 c++

转换如何运作?例如: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?

Mik*_*our 6

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

假设char有8位,则-128与128一致,模256; 这是转换的结果.

更新:如注释中所述,这假定-128是类型的有效值char,但不一定是这种情况.char有一系列的至少[0..127],和signed char至少[-127..127].


Ben*_*igt 5

无符号算术和无符号转换以2 N为模.你有一个8位字符,所以N是8,2 N是256.

-128和128是全等模256.

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

  • 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 结束说明]
  • 如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则该值不变; 否则,该值是实现定义的.