繁体   English   中英

长型 64bit linux

[英]Long type 64bit linux

非常简单的问题伙计们,但也许我只是忘记了一些事情。 在64bit linux中,一个long是8bytes对吗? 如果是这样,并且我想设置第 64 位,我可以执行以下操作:

unsigned long num = 1<<63;

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

num = num&0xFFFFFFFF;

或者关于:

num = (int)(num);

谢谢你。

实际上,如果你想要整数的一些精确长度(以位为单位),假设一个符合C99的编译器, #include <stdint.h>并使用像int64_tint32_t等类型。一个方便的类型是intptr_t ,一个 integer 类型具有相同的作为void*指针的位数(因此您可以将其称为机器“字”)

在64bit linux中,一个long是8bytes对吗?

不必。 取决于编译器而不是底层操作系统。 检查这个以获得很好的讨论。 什么决定了 integer 的大小?

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

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

另外,如果我想获取long类型的前 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 ,编译器可能会发出溢出异常警告

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

限制.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等。

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

像这样的 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;

我认为第一个问题的问题在于编译器将“1”视为 integer,而不是长 integer。直到赋值后才弄明白。

您可以通过执行以下操作来修复它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM