sách gpt4 ai đã đi

c - 不同位长度的 AND 运算

In lại 作者:行者123 更新时间:2023-11-30 18:58:32 31 4
mua khóa gpt4 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 运算,或者是否应该进行强制转换。

Bất kỳ sự giúp đỡ nào cũng sẽ được đánh giá cao!

Cảm ơn

1 Câu trả lời

在 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/

31 4 0
Bài viết được đề xuất: c - 从 C 语言的双向链表中删除重复项
Bài viết được đề xuất: 你能告诉我这有什么问题吗
Bài viết được đề xuất: c# - 发布数据时维护 ViewBag 值
Bài viết được đề xuất: javascript - Dojotoolkit 未捕获异常 : could not load cross domain resources
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com