c/c++语言开发共享什么是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); } 

      以上就是c/c++开发分享什么是char i = 0x80以及为什么在位移时没有发生溢出相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560638.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐