C语言中对负数执行位操作将32位整数31-16位设为0的方法问询
原代码失效原因
C语言中,有符号整数的右移操作在绝大多数编译器下默认是算术右移,会使用符号位的值填充高位。你的变量x是有符号32位int类型,初始值-3的二进制补码为0xFFFFFFFD,左移16位后得到0xFFFD0000,最高位为1,右移16位时算术右移会把高16位全部填充为1,最终结果还是0xFFFFFFFD,自然达不到清零高16位的效果。
可行实现方案
方案1:位与掩码实现(最稳妥,兼容性最强)
直接使用低16位全为1的掩码和x做位与运算,直接清零高16位:
int x = -3; x = x & 0xFFFF;
执行后x的值就是你需要的0x0000FFFD,二进制对应高16位全0、低16位为-3的16位补码。
方案2:无符号类型移位实现
如果要通过移位操作实现,可以先将x强制转换为无符号整数,无符号整数的右移为逻辑右移,固定用0填充高位:
// 严格匹配32位长度建议引入stdint.h头文件: #include <stdint.h> int x = -3; x = (uint32_t)x << 16 >> 16; // 32位平台下也可以直接用unsigned int: // x = (unsigned int)x << 16 >> 16;
方案3:强制转换为16位无符号类型
直接将x强制转换为16位无符号整数,赋值回32位int时会自动保留低16位、高位清零:
#include <stdint.h> int x = -3; x = (uint16_t)x;
内容的提问来源于stack exchange,提问作者yehwang
相关产品推荐
相关产品推荐

