You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么将整型左移24位会得到错误结果且末尾出现'/'字符?

问题原因分析

1. 有符号整数左移触发符号位为负

32位有符号int的取值范围是-2^31 ~ 2^31-1,你初始化的number=255对应十六进制为0x000000FF:

  • 左移23位后结果为0x7F800000,最高位符号位为0,属于合法正整数,计算逻辑正常
  • 左移24位后结果为0xFF000000,最高位符号位为1,对应数值为-16777216,属于负整数

2. 二进制转换函数处理负数的逻辑错误

你写的int_to_bin函数存在多处核心逻辑问题,直接导致异常输出:

(1)负数模运算产生/字符

C语言中整数模运算的结果符号和被除数一致:当num为负数时,num%2的结果为0或-1。当循环运行到num=-1时,num%2 +48 = -1 +48 =47,ASCII码47对应的字符就是你看到的末尾/。

(2)负数除法的终止逻辑异常

负整数每次除以2(C标准规定整数除法向零取整),最终会得到-1,再除以2得到0才终止循环,因此最后一次写入数组的就是对应/的47,前面的24次写入的都是0,就出现了你看到的000000000000000000000000/输出。

额外隐藏问题

你当前的转换函数是将二进制低位存在数组前面、高位存在后面,输出的是逆序的二进制串,只是因为255的二进制全为1,逆序结果和原结果一致,你才没有发现这个问题。如果转换数值为2(二进制10),你会得到输出01。同时循环条件仅判断num!=0,会导致高位的0不会被输出,二进制位数不固定。

修复建议

如果要处理有符号整数的二进制转换,建议将入参强制转换为unsigned int类型,避免符号位带来的异常逻辑,同时调整数组写入顺序,保证输出的二进制是高位在前的正常顺序,也可以固定循环32次来输出完整的32位二进制串。

内容的提问来源于stack exchange,提问作者interesting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:07