gpt4 book ai didi

c - 二进制数 : strange differences between + and |

转载 作者:行者123 更新时间:2023-12-03 18:34:12 28 4
gpt4 key购买 nike

我正在尝试用 c 操作二进制数。我用下面的最小代码发现了一个奇怪的事情。谁能告诉我“+”和“|”有什么区别这里?谢谢!

char next_byte1 = 0b11111111;
char next_byte2 = 0b11110101;
short a = (next_byte1 << 8) | next_byte2;
short b = (next_byte1 << 8) + next_byte2;
printf("a vs b is %d ~ %d.\n", a, b);
它显示:a vs b 是 -11 ~ -267,即 0b11111111 11110101 和 0b11111110 11110101。我对这个结果很困惑。

最佳答案

  • 永远不要将 char 用于二进制/按位算术,因为它具有实现定义的符号性并且可能是负数。通常,在默认 C 类型上使用 stdint.h
  • 如果 char 是有符号的,那么在变量初始化期间,其中的值最终会以二进制补码形式转换为 -1。这发生在 next_byte1next_byte2 上。
  • 每当您在表达式中使用小整数类型时,它通常会被提升为有符号 int 。因此,在您左移之前,您的 -1 (0xFF) 会更改为 -1 (0xFFFFFFF)。
  • 左移负操作数是未定义的行为,这意味着任何类型的错误都可能遍布您的程序。在这种情况下会发生这种情况,因此无法保证结果。
  • 显然,在您的情况下,未定义的行为表现在您以二进制表示的大负数 0xFFFFFF00 结束时。
  • |+ 之间的区别在于后者关心符号,因此在 + 的情况下,您最终将负数相加,但在 | 的情况下,二进制表示只是或:一起。

  • 您可以通过以下方式修复程序:
    #include <stdio.h>
    #include <stdint.h>

    int main(void)
    {
    uint8_t next_byte1 = 0xFF;
    uint8_t next_byte2 = 0xF5;
    uint16_t a = (next_byte1 << 8) | next_byte2;
    uint16_t b = (next_byte1 << 8) + next_byte2;
    printf("a vs b is %d ~ %d.\n", a, b);
    }
    现在 |+ 按预期工作。

    关于c - 二进制数 : strange differences between + and |,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63447416/

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