长型64位linux

de1*_*7ed 5 c linux bit-manipulation

很简单的问题伙计们,但也许我只是忘了什么.在64位linux中,长8字节是否正确?如果是这种情况,我想设置第64位,我可以执行以下操作:

unsigned long num = 1<<63;
Run Code Online (Sandbox Code Playgroud)

然而,无论什么时候我编译它,它都会给我一个错误,说我的移动速度超过了宽度.另外,如果我想采用long类型的前32位(没有符号扩展名),我可以这样做:

num = num&0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

或者说:

num = (int)(num);
Run Code Online (Sandbox Code Playgroud)

谢谢.

Pav*_*ath 4

在64位linux中,long是8字节正确吗?

不必如此。取决于编译器而不是底层操作系统。检查这个以获得良好的讨论。 整数的大小由什么决定?

然而,每当我编译这个时,它都会给我一个错误,说我左移的幅度超过了宽度

这个大家都已经回答了。使用1UL

另外,如果我想获取long类型的前 32 位(不带符号扩展),我可以这样做:

num = num&0xFFFFFFFF;
or what about:

num = (int)(num);
Run Code Online (Sandbox Code Playgroud)

num = num&0xFFFFFFFF。这将为您提供较低的 32 位。但请注意,如果long您的系统上只有 4 个字节,那么您将获得整个数字。来到符号扩展部分,如果您使用了 along而没有使用unsigned long,那么您无法取消符号扩展位。例如,-1从第 0 位开始表示为全 1。如何通过屏蔽来避免这些问题?

num = (int)(num)将为您提供较低的 32 位,但如果num不适合,编译器可能会发出溢出异常警告int

  • 同意 C 不会在 64 位机器上强制“long”为 64 位。然而linux 隐含地强加了这一点。只需查看通过“unsigned long”传递的所有指针和通过“signed long”传递的内存偏移量(例如系统调用)。因此,只要 linux 源代码没有发生巨大的变化,我就会对这个问题回答**是**:“在 64 位 linux 中,‘long’ 是 8 个字节,对吗?” (4认同)