gpt4 book ai didi

c - msvc中的按位运算符左移与linux gcc不同?

转载 作者:行者123 更新时间:2023-11-30 14:37:35 25 4
gpt4 key购买 nike

在使用 GCC 的 Linux 上,1UL<<440x100000000000

但是在使用 MSVC 的 Windows 上,1UL<<440

我很困惑。

这是否表明在 Windows 上左移不能移动超过 32 位?

最佳答案

在 Windows 中 unsigned long s 是 32 位宽。这是由于不幸的 API 总是期望无符号长整型与 32 位(4 字节)同义,而在 Unixen 中,无符号长整型同样经常被错误地假定为具有适合存储指针的大小。因此,在 Unixen 中,使用 64 位无符号长整数是有意义的,而在 Windows 中,别无选择,只能保留它们 32 位。

当然,使用 uint32_t 总是正确的。和uintptr_t分别针对这些,但在标准化之前编写了大量代码。

<小时/>

请注意,标准规定,如果移位量为负数,或者大于或等于移位类型的宽度,则在 Windows 上 1UL << 32有未定义的行为。这是因为如果发生宽移位,有些硬件会将目标归零,有些硬件会中止,有些硬件只考虑模 32 的移位,即在本例中执行 1UL << 0这当然等于 1。因此,由于此操作在任何可移植程序中都没有意义,一些 C 编译器可以愉快地假设它们永远不会发生。

关于c - msvc中的按位运算符左移与linux gcc不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57212719/

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