gpt4 book ai didi

c - 左移溢出

转载 作者:行者123 更新时间:2023-12-04 09:29:45 26 4
gpt4 key购买 nike

当我左移一个有符号的字符时,我不认为我完全理解 c 编译器中发生的事情。我用值 0x8d << 3 初始化它,它给了我一个警告:隐式常量转换溢出。我假设这是因为它为 char 提供了太大的值,但是当我手动完成时,我得到 104 作为答案。

这是否意味着当值被转移时它正在做

10001101 << 3 = 10001101000

而不是

10001101 << 3 = 01101000

想通了,但这是代码:

signed char testChar = 0x8d << 3;
printf("testChar : %d\n", testChar);

只需正常初始化它,然后将其转移到另一条线上, super 简单的东西。

最佳答案

你的问题很困惑:你是在用值 0x8d << 3 初始化一个有符号的字符吗? ?这显然是实现定义,因为该值超出了类型的范围并且该类型已签名。编译器发出警告,因为精度损失是明确的。

相反,如果您的意思是左移一个带符号的字符,左移一个值为0x8d 的带符号的字符。 , 这又是不正确的:除非 char超过 8 位,则带符号的 char 的值不能为 0x8d。它的值可以是 -115具有相同的位模式。左移将以这种方式计算:

  • char值首先提升为int .
  • int value 左移 3 but positions: 这相当于乘以 8。
  • 如果值为负,标准表示行为未定义,但大多数使用 2s 补码表示负值的当前处理器只会产生与乘以 8 相同的结果。

结果值为 -920 .此值不适合 char .将其存储到 char是实现定义的。最有可能的结果是 char 104 的值.

编辑

您发布了实际代码:

signed char testChar = 0x8d << 3;
printf("testChar : %d\n", testChar);

如果char是 8 位,分配具有实现定义的行为,因为 1128超出类型 signed char 的范围(-128..127),大多数现代处理器的行为是屏蔽掉高位并将 8 个低位存储到目标字节中,就好像它是一个 unsigned char。 .在您的情况下,结果是 1128 & 255 -> 104 .

关于c - 左移溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com