长型64位linux

时间:2012-04-06 06:47:19

标签: c linux bit-manipulation

非常简单的问题,但也许我只是忘了什么。 在64位linux中,长8字节是否正确? 如果是这种情况,我想设置第64位,我可以执行以下操作:

unsigned long num = 1<<63;

然而,每当我编译它时,它会给我一个错误,说我离开的宽度超过了宽度。 另外,如果我想采用long类型的前32位(没有符号扩展名),我可以这样做:

num = num&0xFFFFFFFF;

或者说:

num = (int)(num);

谢谢。

5 个答案:

答案 0 :(得分:4)

实际上,如果你想要整数的精确长度(以位为单位),假设符合 C99 的编译器,#include <stdint.h>并使用类似int64_t的类型,{{1一个方便的类型是int32_t,一个与intptr_t指针具有相同位数的整数类型(所以你可以将它称为机器“word”)

答案 1 :(得分:3)

  

在64位linux中,long是8bytes正确吗?

不必。取决于编译器而不是底层操作系统。检查一下这是一个很好的讨论。 What decides the sizeof an integer?

  

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

每个人都已经回答了这个问题。使用1UL

  

另外,如果我想拍摄类型的前32位(没有   签名延期),我可以这样做:

num = num&0xFFFFFFFF;
or what about:

num = (int)(num);

num = num&0xFFFFFFFF。这将为您提供较低的32位。但请注意,如果long只是您系统上的4个字节,那么您将获得整数。来到符号扩展部分,如果您使用了long而不是unsigned long,则无法取消符号扩展位。例如,-1表示为全1,从第0位开始。你将如何通过掩蔽来避免这些?

num = (int)(num)将为您提供较低的32位,但如果num不适合int

,编译器可能会通过溢出异常警告

答案 2 :(得分:1)

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

limits.h中

#define LNG_BIT   (sizeof(long) * CHAR_BIT)

unsigned long num = 1UL << (LNG_BIT - 1);

获取“ low int ”,类似于?:

#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:

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

还有-maddress-mode=long等。

-maddress模式=长
为长地址模式生成代码。这仅适用于64位和x32环境。它是64位环境的默认地址模式。

答案 3 :(得分:0)

我认为第一个问题的问题是编译器将'1'视为整数,而不是长整数。直到任务完成后才会弄明白。

您可以通过执行以下操作来解决此问题:

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

答案 4 :(得分:0)

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

unsigned long num = 1<<63;

如果你说的是x86_64,是的,long是64位,而且大多数其他的64位linux plytforms也是如此。问题是代码中的163都是简单int,因此结果未定义。更好地使用

 unsigned long num = 1UL<<63;

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