c - 长型 64 位 linux

标签 c linux bit-manipulation

非常简单的问题,伙计们,但也许我只是忘记了什么。 在 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/

相关文章:

c - free() 使代码崩溃

linux - SQR:加载共享库时出错:libpdf.so

linux - 类似于 RAPL 的非 Sandy Bridge/xeon 处理器

c - 使用 XOR 属性找出数组中修改的元素

c# - 线性反馈移位寄存器效率

java - 仅加密图像文件的内容而不是整个文件

c++ - (Windows HID API)HidD_GetPreparsedData() 由于句柄不正确而在 WM_INPUT 消息处理程序中失败?

c - 从 execl() 运行脚本

c - 用 OpenCL C 编写快速线性系统求解器

linux - Cygwin XWin 服务器随机失去连接