gpt4 book ai didi

c - 不同位长度的 AND 运算

转载 作者:行者123 更新时间:2023-11-30 18:58:32 30 4
gpt4 key购买 nike

我有以下内容:

void calculate(unsigned long num1, unsigned long num2){
int32_t invertednum2 = ~(num2); // yields 4294967040
printf("%d\n", invertednum2); // yields 255

// num1 is 3232236032
int32_t combine = (int32_t) num1 & num2;
printf("%d\n", combine); // yields 0???
}

我正在尝试对 num1 和 num2 进行 AND 运算,结果是:

   000000000000000011111111

我不确定我是否正确地对两个不同的位长度进行了 AND 运算,或者是否应该进行强制转换。

如有任何帮助,我们将不胜感激!

谢谢

最佳答案

在 C 中不能对不同的位长度进行 AND 运算,因为不能对不同类型的操作数应用任何二元运算符(移位除外)。如果您编写的操作数类型不同的代码,C 编译器会在执行操作之前首先将它们转换为相同的类型(因此大小相同)。 C 规范中有 7 页(第 6.3 节)专门详细介绍了这种情况是如何发生的。

因此,当你有:

int32_t combine = (int32_t) num1 & num2;

num1num2都是unsigned long并且是64位,会发生的是:

  1. 转换会将 num1 截断为 32 位
  2. AND 具有不同的操作数类型(int32_t 和 uint64_t),因此 int32_t 将被符号扩展为 64 位。
  3. 对这两个 64 位值执行 AND
  4. 结果被截断回 32 位并存储在 combine

现在,由于 num1 为 3232236032 (0xc0a80200),因此步骤 1 和 2 会将其转换为 0xffffffffc0a80200,并将其与 num2 进行 AND 运算,然后丢弃前 32 位。

相反,如果您有:

int32_t combine = (int32_t)(num1 & num2);

它将对 num1num2 执行 64 位 AND,然后截断为 32 位以存储在 combine 中。虽然这与第一种情况有很大不同,但 combine 中存储的结果值将完全相同 - 只有没人见过的中间值(按位 AND 的结果)会有所不同。因此,编译器可以自由地重新排列事物并为这两种情况生成完全相同的代码。

关于c - 不同位长度的 AND 运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16075804/

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