[英]GCC quad size 32 and 64 bit
我在Linux上使用GCC
編譯器。
我想使用64位編譯器,並使用-m32
選項(32位兼容性)構建某些文件。 我發現了奇怪的編譯器行為。
我的代碼很簡單:
int main () {
int test =(((0) & 0x00000000) << (32));
return 0;
}
和用於這個代碼我接收的警告為32
, 64
和64
與-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)
為什么對於從c
和asm
文件編譯的相同代碼,對於不同的編譯器(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.