Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC四元大小32和64位_C_Gcc_Assembly_Compilation - Fatal编程技术网

GCC四元大小32和64位

GCC四元大小32和64位,c,gcc,assembly,compilation,C,Gcc,Assembly,Compilation,我正在Linux上使用GCC编译器。 我想使用64位编译器并使用-m32选项(32位兼容性)构建一些文件。我发现编译器的行为(对我来说)很奇怪。 我的代码很简单: int main () { int test =(((0) & 0x00000000) << (32)); return 0; } 但是当我试图从assebmly code编译它时: .quad (((0) & (0x00000000)) << (32)) 为什么对于从c和asm

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

int main () {
   int test =(((0) & 0x00000000) << (32));
   return 0;
}
但是当我试图从
assebmly code
编译它时:

.quad (((0) & (0x00000000)) << (32))
为什么对于从
c
asm
文件编译的相同代码,针对不同编译器(32位和64位)的警告不同

编辑:


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

在C中,移位的左操作数的类型是
int
,这在讨论的两种平台上都是32位的,因此移位在C语言中始终是未定义的行为


我设想在汇编程序中,操作数分别是32位或64位。

在C语言中,移位的左操作数类型是int,在讨论的两种平台上都是32位,因此移位在C语言中始终是未定义的行为


我设想在汇编程序中,操作数分别是32位或64位。

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

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


long-long-test=((0)&0x00000000LL)在64位模式下,gcc使用LP64约定。这意味着
long
和指针的宽度为64位,但
int
仍然只有32位宽。在表达式中

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


long-long测试=((0)和0x00000000LL)一个是C编译器,另一个是汇编程序,只要它们包含相同的信息,似乎没有什么错误,Btw.为什么会被标记为C++?@ PrasaMH UGH,抱歉我不想添加<代码> C++ >代码>……一个是C编译器,另一个是汇编程序,似乎没有什么错误,只要它们包含相同的信息,Btw.为什么会被标记为C++?@ PrasaMh UGH,抱歉我不想添加<代码> C++ >代码>……实际上他使用的是<代码> Quad 。这样,即使在32位模式下,它也能使64位。如果汇编程序发出警告,那就是一个bug。或者是一个限制。事实上,他使用的是
.quad
,因此即使在32位模式下也是64位的。如果汇编程序产生警告,那就是一个错误或限制。感谢您的完整答案。但是为什么我在编译asm代码结果(警告)时会这样呢不同?以及如何将
LL
添加到宏定义或
asm
文件?感谢您的完整回答。但为什么在编译asm代码时结果(警告)不同?以及如何将
LL
添加到宏定义或
asm
文件?
  int test =(((0) & 0x00000000) << (32));
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