这是一个程序
#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值0x80
。 0x80 == 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); }
以上就是c/c++开发分享什么是char i = 0x80以及为什么在位移时没有发生溢出相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560638.html