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)
谢谢.
在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