什么是char i = 0x80以及为什么在位移时没有发生溢出

这是一个程序

#include  main() { unsigned char i=0x80; printf("i=%d",i<<1); } 

它给出的输出是256.我不清楚它是什么

 unsigned char i=0x80; <-- i is not int it is char so what will it store? 

我知道bitshift和hex的东西。 如何存储i的值以及如何将其更改为256?

UPDATE

为什么在位移操作发生时没有发生溢出?

在C中, char是用于存储字符数据的整数类型,通常为1个字节。

存储在i的值是0x80 ,hex常数等于128

对两个整数类型(例如i << 1 )的算术运算将提升为更宽的类型,在本例中为int ,因为1是int常量。 在任何情况下,整数函数参数都提升为int。

然后将结果发送到printf ,使用%d格式说明符,表示“打印整数”。

我认为K&R对这个问题有最好的答案:

2.7类型转换当运算符具有不同类型的操作数时,它们将根据少量规则转换为通用类型。 通常,唯一的自动转换是那些将narrower'' operand into a更宽的”而不丢失信息的转换,例如将整数转换为像f + i这样的表达式中的浮点。 没有意义的表达式,例如使用float作为下标,是不允许的。 可能丢失信息的表达式,例如将较长的整数类型分配给较短的,或者将浮点类型分配给整数,可能会引发警告,但它们不是非法的。 char只是一个小整数,因此字符可以在算术表达式中自由使用。

所以我<< 1在转换之前将i转换为int。 Ken Vanerlinde说得对。

0x80是hex。 操作x << 1表示左移一个,有效地将该数乘以2,因此结果为256

i=0x80在i中存储hex值0x800x80 == 128

printf()格式语句中打印出值时,传递给printf()语句的值为i<<1

<<运算符是一元按位左移运算符,它将i的位移动到左侧的一个位置。

二进制128是“10000000”,向右移一位给出'100000000'或256。

i << 1不存储在i中。 因此,没有溢出的问题,256是输出。

以下代码将输出0作为输出。

 #include  main() { unsigned char i=0x80; i = i<<1; printf("i=%d",i); }