gpt4 book ai didi

c++ - 为什么是0x7FFFFFFFull | (1 << 31) 在 C++ 中返回 0xFFFFFFFFFFFFFFFF?

转载 作者:行者123 更新时间:2023-12-02 01:50:32 30 4
gpt4 key购买 nike

当我执行 (0x7fffffff | 0x8000000) 时,我得到 0xffffffffffffffff 而不是预期的 0xffffffff。我错过了什么?

一些示例代码和输出来说明我的问题。

代码:

#include <iostream>

using namespace std;

int main()
{
unsigned long long val = 0;

for (int i = 0; i < 64; i++) {
val |= 0x1 << i;
cout << i << ": " << std::hex << val << std::dec << endl;
}

return 0;
}

输出:

0: 11: 32: 73: f4: 1f5: 3f6: 7f7: ff8: 1ff9: 3ff10: 7ff11: fff12: 1fff13: 3fff14: 7fff15: ffff16: 1ffff17: 3ffff18: 7ffff19: fffff20: 1fffff21: 3fffff22: 7fffff23: ffffff24: 1ffffff25: 3ffffff26: 7ffffff27: fffffff28: 1fffffff29: 3fffffff30: 7fffffff31: ffffffffffffffff32: ffffffffffffffff33: ffffffffffffffff34: ffffffffffffffff35: ffffffffffffffff36: ffffffffffffffff37: ffffffffffffffff38: ffffffffffffffff39: ffffffffffffffff40: ffffffffffffffff41: ffffffffffffffff42: ffffffffffffffff43: ffffffffffffffff44: ffffffffffffffff45: ffffffffffffffff46: ffffffffffffffff47: ffffffffffffffff48: ffffffffffffffff49: ffffffffffffffff50: ffffffffffffffff51: ffffffffffffffff52: ffffffffffffffff53: ffffffffffffffff54: ffffffffffffffff55: ffffffffffffffff56: ffffffffffffffff57: ffffffffffffffff58: ffffffffffffffff59: ffffffffffffffff60: ffffffffffffffff61: ffffffffffffffff62: ffffffffffffffff63: ffffffffffffffff

最佳答案

首先,您的代码没有执行您在标题/问题中所说的操作;我已经编辑了标题。

问题是1 << 31 。如果你有32位int (显然你这样做,从结果来看),这会导致算术溢出。在 C++14 中,这是实现定义的行为;在 C++14 之前,它会导致未定义的行为。 Reference .

通常,实现定义的行为是生成设置了符号位而未设置其他位的 int。在 2 的补码中,该值为 INT_MIN 。然后,您可以在 unsigned long long 之间执行算术运算。和一个int 。这定义为:int转换为unsigned long long .

将有符号整数转换为无符号整数是通过将其环绕(模算术)模 ULLONG_MAX+1 来完成的。所以结果是(unsigned long long)INT_MIN是一个非常大的正数,事实上0xFFFFFFFF80000000 。 (要检查这一点,请添加 0x80000000 以获得 0 )。

所以你实际上在做0x7FFFFFFF | 0xFFFFFFFF80000000这给出了观察到的结果。

<小时/>

后来情况变得更糟:1 << 32较大的值会由于移动整个类型的宽度而导致未定义的行为。

要解决此问题,请更改 0x1在你的代码中 1ull 。您将转移 unsigned long long ,而不是 int .

关于c++ - 为什么是0x7FFFFFFFull | (1 << 31) 在 C++ 中返回 0xFFFFFFFFFFFFFFFF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30905196/

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