负十进制数转二进制表示:现有C程序仅支持正数求适配方案
负十进制数转二进制数组的实现方案
核心思路
计算机中带符号整数通常用补码存储,N位负数的补码计算规则为:对应正整数的原码逐位取反后加1,你原有逻辑已经覆盖了正整数转原码的流程,只要补充补码计算逻辑即可适配负数场景。
具体修改点
- 提前判断输入数值的符号,负数先取其绝对值完成正整数转二进制的流程
- 对得到的正整数二进制逐位取反,再执行加1操作处理进位,得到负数的补码结果
- 不需要改动最终输出的遍历逻辑,直接输出补码数组即可
修改后完整可运行代码
#include <stdio.h> #include <stdlib.h> #define N 32 // 对应32位int的位数,可按需调整为8/16等你需要的长度 int main(int argc, char *argv[]) { if (argc < 2) { printf("请传入要转换的十进制数参数\n"); return 1; } int n = atoi(argv[1]); int binRep[N]; int i; int is_negative = 0; // 初始化数组全为0 for (i = 0; i < N; i++) { binRep[i] = 0; } // 标记负数,取绝对值走正整数转换逻辑 if (n < 0) { is_negative = 1; n = -n; } i = 0; // 正整数转二进制逻辑和你原有写法一致 while (n > 0 && i < N) { binRep[i] = n % 2; n = n / 2; i++; } // 负数补码处理 if (is_negative) { // 第一步逐位取反 for (i = 0; i < N; i++) { binRep[i] = binRep[i] ^ 1; } // 第二步加1处理进位 int carry = 1; i = 0; while (carry && i < N) { int sum = binRep[i] + carry; binRep[i] = sum % 2; carry = sum / 2; i++; } } // 从高位到低位输出,逻辑和你原有写法一致 for (i = N - 1; i >= 0; i--) { printf("%d", binRep[i]); } printf("\n"); return 0; }
注意事项
- 代码里的
N宏定义了二进制的位数,按需调整即可,比如要做8位二进制输出就改成8 - 如果需要处理int最小值(-2^31)的边界情况,可以把n的类型改成long long避免取绝对值溢出,普通日常场景上述代码足够使用
内容的提问来源于stack exchange,提问作者cookielover1120
相关产品推荐
相关产品推荐

