很简单的问题家伙,但也许我只是忘记了一些东西。 在64bit的linux中,长度是8bytes是正确的吗? 如果是这样的话,我想设置第64位,我可以做到以下几点:
unsigned long num = 1<<63;
然而,每当我编译这个,它给了我一个错误,说我左移超过宽度。 另外,如果我想采取长types的第一个32位(没有符号扩展),我可以这样做:
num = num&0xFFFFFFFF;
或者如何:
num = (int)(num);
谢谢。
在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_t
, int32_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:
-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平台上。 问题是你的代码中的1
和63
都是简单的int
,所以结果是不确定的。 更好地使用
unsigned long num = 1UL<<63;
要么
unsigned long num = (unsigned long)1<<63;