簡體   English   中英

GCC Quad大小32和64位

[英]GCC quad size 32 and 64 bit

我在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]

但是,當我嘗試從assebmly code進行編譯時:

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

我只收到32 bit編譯器的警告:

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

為什么對於從casm文件編譯的相同代碼,對於不同的編譯器(32和64位),警告會有所不同?

編輯:

我在代碼中哪里可以找到.quad定義?

在64位模式下,gcc使用LP64約定。 這意味着long和指針的寬度為64位,而int仍然僅為32位。 在表達中

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

ints假定為ints ,因為int足以容納所有常量,並且int始終僅為32位。 這種類型的移位> =寬度的結果是C中的UB,因為行為通常取決於基礎體系結構的移位指令。

通過強制數字之一為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語言中,移位的左操作數的類型為int ,在上述兩個平台上均為32位,因此就C語言而言,移位始終是未定義的行為。

我想象在您的匯編器中,操作數分別是32位或64位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM