非常简单的问题,伙计们,但也许我只是忘记了什么。 在 64 位 linux 中,long 是 8bytes 正确吗? 如果是这样,并且我想设置第 64 位,我可以执行以下操作:
unsigned long num = 1<<63;
然而,每当我编译它时,它都会给我一个错误,说我左移的幅度超过了宽度。 另外,如果我想获取 long 类型的前 32 位(没有符号扩展),我可以这样做吗:
num = num&0xFFFFFFFF;
或者关于:
num = (int)(num);
谢谢。
最佳答案
In 64bit linux, a long is 8bytes correct?
不必。取决于编译器而不是底层操作系统。检查这个以获得很好的讨论。 What decides the sizeof an integer?
Whenever I compile this, however, it gives me an error saying that I'm left shifting by more than the width
这个大家都已经回答过了。使用 1UL
Also, if I wanted to take the first 32bits of a long type (without sign extension), can I do:
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
不适合 ,编译器可能会发出溢出异常警告>整数
关于c - 长型 64 位 linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10040123/