非常简单的问题,但也许我只是忘了什么。 在64位linux中,长8字节是否正确? 如果是这种情况,我想设置第64位,我可以执行以下操作:
unsigned long num = 1<<63;
然而,每当我编译它时,它会给我一个错误,说我离开的宽度超过了宽度。 另外,如果我想采用long类型的前32位(没有符号扩展名),我可以这样做:
num = num&0xFFFFFFFF;
或者说:
num = (int)(num);
谢谢。
答案 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)
unsigned long num = 1<<63;
如果你说的是x86_64,是的,long是64位,而且大多数其他的64位linux plytforms也是如此。问题是代码中的1
和63
都是简单int
,因此结果未定义。更好地使用
unsigned long num = 1UL<<63;
或
unsigned long num = (unsigned long)1<<63;