gpt4 book ai didi

c - GCC quad 大小 32 位和 64 位

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:46 24 4
gpt4 key购买 nike

我在 Linux 上使用 GCC 编译器。
我想使用 64 位编译器并使用 -m32 选项(32 位兼容性)构建我的一些文件。我发现编译器的奇怪(对我来说)行为。
我的代码很简单:

int main () {
int test =(((0) & 0x00000000) << (32));
return 0;
}

对于这段代码,我收到了 326464 以及 -m32 编译器的警告:

warning: left shift count >= width of type [enabled by default]

但是当我尝试从汇编代码编译它时:

.quad (((0) & (0x00000000)) << (32))

我只收到针对 32 位 编译器的警告:

Warning: shift count out of range (32 is not between 0 and 31)

为什么针对不同编译器(32 位和 64 位)从 casm 文件编译的相同代码的警告不同?

编辑:

我在哪里可以找到 .quad 定义,我是说在代码中?

最佳答案

在 64 位模式下,gcc 使用 LP64 约定。这意味着 long 和指针是 64 位宽,但 int 仍然只有 32 位宽。在表达式中

  int test =(((0) & 0x00000000) << (32));

常量都假定为 int,因为 int 足够大,可以容纳它们,而 int 总是只有 32位。 shift >= 类型宽度的结果在 C 中是 UB,因为该行为通常取决于底层架构的 shift 指令。

通过强制其中一个数字为 64 位来抑制警告。

long test =(((0) & 0x00000000L) << (32)); // Still gives a warning with -m32

long long test =(((0) & 0x00000000LL) << (32)); // No warning, long long is always 64 bit

关于c - GCC quad 大小 32 位和 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378638/

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