C语言将32位二进制数逐位存入数组的实现问题排查
代码问题分析
- 输入溢出:你使用
int类型接收用户输入的32位二进制数字串,该串作为十进制数远大于32位int的最大取值(约21亿,仅支持10位十进制数),输入阶段就会发生溢出,存储的数值本身就是错误的。 - 数组越界:定义的
arr[32]合法下标范围为0~31,你的循环变量i从32开始取值,访问arr[32]属于越界内存访问,会产生不可预期的异常结果。 - 存储逻辑不符合需求:你从输入数值的最低位开始取数,存到数组的高位下标位置,最终32位二进制的最高位不会存储在
arr[0],而是存放在下标为32 - 输入长度的位置,和你的预期不符。
修正方案
方案1:以字符串形式处理输入(推荐,匹配你输入二进制串的场景)
直接读取用户输入的二进制字符串,逐字符转换为数字存入数组,完全避免数值溢出问题:
#include <stdio.h> #include <string.h> int main () { // 预留32位字符+1位字符串结束符的空间 char binary_str[33]; int arr[32]; printf("Enter A binary Number:\n"); // 限制最多输入32位,避免数组溢出 scanf("%32s", binary_str); int input_len = strlen(binary_str); for(int i = 0; i < 32; i++){ // 输入不足32位时高位自动补0,可根据需求调整补位逻辑 if(i < 32 - input_len){ arr[i] = 0; }else{ arr[i] = binary_str[i - (32 - input_len)] - '0'; } } printf("The first digit is %d", arr[0]); return 0; }
方案2:输入十进制整数,转32位二进制位存入数组
如果你的实际需求是输入一个十进制整数,将其对应的32位二进制位存入数组,arr[0]存储最高位,可以用移位操作实现:
#include <stdio.h> #include <stdint.h> int main () { // 用32位无符号整数存储输入的数值,避免符号位干扰 uint32_t num; int arr[32]; printf("Enter A decimal Number:\n"); scanf("%u", &num); for(int i = 0; i < 32; i++){ // 从最高位开始依次取每一位的数值 arr[i] = (num >> (31 - i)) & 1; } printf("The first digit (highest bit) is %d", arr[0]); return 0; }
内容的提问来源于stack exchange,提问作者Exx
相关产品推荐
相关产品推荐

