很简单的问题球员,但也许我只是忘了什么东西。 在64位版,长为8个字节是否正确? 如果是这样的话,我想设定的第64位,我可以做到以下几点:
unsigned long num = 1<<63;
每当我编译这一点,但是,它给了我一个错误,说我左移比宽度多。 另外,如果我想需要很长的类型的第一个32位(无符号扩展),我该怎么办:
num = num&0xFFFFFFFF;
或者怎么样:
num = (int)(num);
谢谢。
很简单的问题球员,但也许我只是忘了什么东西。 在64位版,长为8个字节是否正确? 如果是这样的话,我想设定的第64位,我可以做到以下几点:
unsigned long num = 1<<63;
每当我编译这一点,但是,它给了我一个错误,说我左移比宽度多。 另外,如果我想需要很长的类型的第一个32位(无符号扩展),我该怎么办:
num = num&0xFFFFFFFF;
或者怎么样:
num = (int)(num);
谢谢。
在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
实际上,如果你想为你的整数一些精确长度(位),假设符合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);
为了得到“ 低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,长和指针类型为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位环境的默认地址模式。
我相信,第一个问题,问题是编译器处理“1”作为一个整数,而不是一个长整型。 它没有弄明白,直到分配之后。
您可以通过执行修复:
unsigned long num = (unsigned long)1<<63;
这样AFAIR代码是reiserfs的一个重大错误的根源在几年前:
unsigned long num = 1<<63;
如果你讲x86_64的,是的,长为64位和大多数其他64位Linux plytforms了。 问题是,无论是1
和63
在你的代码很简单int
,所以结果是不确定的。 更好地利用
unsigned long num = 1UL<<63;
要么
unsigned long num = (unsigned long)1<<63;