长型64位的Linux(Long type 64bit linux)

2019-09-16 09:42发布

很简单的问题球员,但也许我只是忘了什么东西。 在64位版,长为8个字节是否正确? 如果是这样的话,我想设定的第64位,我可以做到以下几点:

unsigned long num = 1<<63;

每当我编译这一点,但是,它给了我一个错误,说我左移比宽度多。 另外,如果我想需要很长的类型的第一个32位(无符号扩展),我该怎么办:

num = num&0xFFFFFFFF;

或者怎么样:

num = (int)(num);

谢谢。

Answer 1:

在64位版,长为8个字节是否正确?

不需要。 依赖于编译器比底层操作系统。 检查这一个不错的讨论。 什么决定的sizeof的整数?

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

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

另外,如果我想需要很长的类型的第一个32位(无符号扩展),我该怎么办:

num = num&0xFFFFFFFF;
or what about:

num = (int)(num);

num = num&0xFFFFFFFF 。 这会给你低32位。 但要注意的是,如果long在你的系统,那么你所得到的是整个数字上只有4个字节。 即将于符号扩展部分,如果你已经使用了long ,而不是unsigned long ,那么你不能做掉与符号扩展位。 例如, -1表示为所有的,从右边第0位。 您将如何通过屏蔽避免这些的呢?

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



Answer 2:

实际上,如果你想为你的整数一些精确长度(位),假设符合C99编译器, #include <stdint.h>和利用类型等int64_tint32_t等一个方便的类型是intptr_t ,具有相同的整数型作为位数void*指针(这样你就可以把它叫做一个机器“字”)



Answer 3:

对于便携性,你可以使用:

limits.h中

#define LNG_BIT   (sizeof(long) * CHAR_BIT)

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

为了得到“ 低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:

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

-m32
-m64
-mx32
产生用于32位或64位的环境的代码。
*本-m32选项集INT,长和指针类型为32位,并产生任何I386系统上运行的代码。
*本-m64选项集诠释为32位长和指针类型到64位,并为x86-64架构生成代码。 对于达尔文只有-m64选项也关闭了-fno-PIC和-mdynamic-NO-PIC选项。
*本-mx32选项设置的int,long和指针类型为32位,并为x86-64架构生成代码。

还有-maddress-mode=long

-maddress模式=长
产生长期的地址模式的代码。 这仅支持64位和X32环境。 它是64位环境的默认地址模式。



Answer 4:

我相信,第一个问题,问题是编译器处理“1”作为一个整数,而不是一个长整型。 它没有弄明白,直到分配之后。

您可以通过执行修复:

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


Answer 5:

这样AFAIR代码是reiserfs的一个重大错误的根源在几年前:

unsigned long num = 1<<63;

如果你讲x86_64的,是的,长为64位和大多数其他64位Linux plytforms了。 问题是,无论是163在你的代码很简单int ,所以结果是不确定的。 更好地利用

 unsigned long num = 1UL<<63;

要么

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


文章来源: Long type 64bit linux