长型64位linux

很简单的问题家伙,但也许我只是忘记了一些东西。 在64bit的linux中,长度是8bytes是正确的吗? 如果是这样的话,我想设置第64位,我可以做到以下几点:

unsigned long num = 1<<63; 

然而,每当我编译这个,它给了我一个错误,说我左移超过宽度。 另外,如果我想采取长types的第一个32位(没有符号扩展),我可以这样做:

 num = num&0xFFFFFFFF; 

或者如何:

 num = (int)(num); 

谢谢。

Solutions Collecting From Web of "长型64位linux"

在64bit的linux中,长度是8bytes是正确的吗?

不一定是。 取决于编译器而不是基础操作系统。 检查这个很好的讨论。 什么决定一个整数的大小?

然而,每当我编译这个,它给了我一个错误,说我左移超过宽度

大家已经回答了这个。 使用1UL

另外,如果我想取一个类型的第一个32位(没有符号扩展名),我可以这样做:

 num = num&0xFFFFFFFF; or what about: num = (int)(num); 

num = num&0xFFFFFFFF 。 这会给你更低的32位。 但是请注意,如果系统中只有4个字节long那么你就得到了整个数字 。 来到符号扩展部分,如果您使用了long而不是unsigned long那么您unsigned long符号扩展位。 例如, -1表示为全1,从第0位开始。 你将如何避免这些掩盖?

num = (int)(num)会给你较低的32位但编译器可能会通过溢出异常警告如果num不适合int

实际上,如果你想要一些精确的长度(以位为单位)整数,假定一个符合C99的编译器, #include <stdint.h>并使用像int64_tint32_t等类型。一个便利的类型是intptr_t ,一个整型作为void*指针的位数(所以你可以称之为一个机器的“单词”)

为了便于携带,您可以使用:

limits.h中

 #define LNG_BIT (sizeof(long) * CHAR_BIT) unsigned long num = 1UL << (LNG_BIT - 1); 

为了得到“ 低整数 ”,像?:

 #define INT_BIT (sizeof(int) * CHAR_BIT) if (LNG_BIT > INT_BIT) return num & (~0UL >> INT_BIT); else return num; 

要么

  num &= ~(~0U << INT_BIT); 

或者,使用掩码等等,取决于为什么,为什么,等你想要的int位。

另请注意编译器提供的选项; 也就是说,如果你使用的是gcc:

  • i386和x86-64选项
  • 子模型选项

-m32
-m64
-mx32
为32位或64位环境生成代码。
* -m32选项将int,long和指针类型设置为32位,并生成在任何i386系统上运行的代码。
* -m64选项将int设置为32位,将指针类型设置为64位,并生成x86-64体系结构的代码。 对于达尔文,只有-m64选项也会关闭-fno-pic和-mdynamic-no-pic选项。
* -mx32选项将int,long和指针类型设置为32位,并为x86-64体系结构生成代码。

还有-maddress-mode=long

-maddress模式=长
为长地址模式生成代码。 这仅在64位和x32环境中受支持。 这是64位环境的默认地址模式。

我相信第一个问题的问题是编译器将“1”视为整数,而不是长整数。 直到任务完成之后,它才算出来。

你可以通过以下操作来修复它:

 unsigned long num = (unsigned long)1<<63; 

像这样的AFAIR代码几年前是reiserfs中的一个主要bug的来源:

 unsigned long num = 1<<63; 

如果你说的是x86_64,是的,长64位,在大多数其他64位linux平台上。 问题是你的代码中的163都是简单的int ,所以结果是不确定的。 更好地使用

  unsigned long num = 1UL<<63; 

要么

  unsigned long num = (unsigned long)1<<63;