当前位置: 首页 > 知识库问答 >
问题:

c - 如何将十进制数转换为二进制并初始化数组?

林礼骞
2025-09-01
#include<stdio.h>
#define n 32
int main()
{
    int a = 0, b = 1, c = 0, i = 0;
    int arr[n] = { 0 };
    int arr1[n] = { 0 };
    scanf_s("%d", &a);
    for (int b = 1; b >= 1; a = a / 2)
    {
        b = a / 2;
        c = a % 2;
        arr[i] = c;
        i++;
    }
    printf("\n");
    int sz = sizeof(arr) / sizeof(arr[0]);
    int* p = arr;
    for(i=0;i<n;i++)
    {
        *(p + i) = arr1[sz - 1 - i];
    }
    for (i = 0; i < n; i++)
    {
        printf("%d", arr1[i]);
    }
    return 0;
}

这段代码编译器提示应初始化内存,应该如何做?

想把一个十进制数转化成二进制,
但是for(i=0;i<n;i++)

{
    *(p + i) = arr1[sz - 1 - i];
}//这段好像有问题,为何不能将指针接引用后赋值给数组?

共有2个答案

潘琨
2025-09-01
#include <stdio.h>

const int n = 32;
int main() {
  int a, arr[n], i = 0;

  scanf("%d", &a);

  do {
    printf("%d %d %d\n", a, a % 2, a / 2);
    arr[i++] = a % 2;
    a /= 2;
  } while (a);

  for (int j = i - 1; j >= 0; j--)
    printf("%d", arr[j]);
  return 0;
}
齐昊焱
2025-09-01

你的代码存在几个问题,特别是转换和赋值逻辑错误。以下是修正后的代码和详细解释:

#include <stdio.h>
#define n 32

int main() {
    int a = 0;
    int arr[n] = {0};   // 存储二进制(低位在前)
    int arr1[n] = {0};  // 存储最终结果(高位在前)
    int i = 0;          // 有效位计数器
    
    scanf_s("%d", &a);
    
    // 生成二进制位(低位存储在低索引)
    while (a > 0 && i < n) {
        arr[i] = a % 2; // 存储余数
        a /= 2;         // 更新商
        i++;            // 递增计数器
    }
    
    // 反转移位到arr1(高位在前)
    for (int j = 0; j < i; j++) {
        arr1[n - 1 - j] = arr[j]; // 将低位挪到数组末端
    }
    
    // 打印32位二进制
    for (int k = 0; k < n; k++) {
        printf("%d", arr1[k]);
    }
    return 0;
}

关键问题和修正:

  1. 初始化问题
    原代码arr1未正确赋值导致输出全0。我已明确初始化两个数组为全0:

    int arr[n] = {0};
    int arr1[n] = {0};
  2. 赋值逻辑错误
    这段代码有根本性错误:

    *(p + i) = arr1[sz - 1 - i];  // 错误!
    • 错误1:尝试用未初始化的arr1覆盖arr(数据全部丢失)
    • 错误2:指针p指向arr但修改源应该是arr1

    修正为:

    arr1[n - 1 - j] = arr[j];  // 正确转移数据
  3. 转换逻辑优化

    • 使用while循环替代有风险的for循环,更清晰地处理位生成
    • 添加i < n防止溢出(最大支持32位)
  4. 输出格式
    直接打印arr1(高位在前),确保32位格式:

    输入:10
    输出:00000000000000000000000000001010

核心逻辑说明:

  1. 十进制转二进制

    while (a > 0) {
        arr[i++] = a % 2;  // 低位存入arr[0]开始
        a /= 2;
    }

    例如 10(十进制)→ 得到 arr = [0,1,0,1,...](低位0在最前)

  2. 高位对齐处理

    arr1[32-1-j] = arr[j];  // 将arr的低位挪到arr1的末端
    • j=0: arr[0] → arr1[31](最低位)
    • j=1: arr[1] → arr1[30]
    • ...
      最终形成高位在前的32位格式
注意:此代码支持0~2³²-1的正数。处理负数需补码转换(未包含在此方案中)。
 类似资料:
  • 问题内容: 如何在Swift中将Int转换为UInt8?例。我想将数字22转换为0b00010110 问题答案: 您可以使用带有参数的初始化程序将十进制值转换为人类可读的二进制 表示形式 : 如果您愿意,也可以很容易地用任意数量的零填充它: 斯威夫特5

  • 我正试图编写一个程序,将二进制数字转换成相应的十进制值。虽然错误报告有效,但我似乎在这里得到了与输出相同的二进制数。fIdx是一种正向扫描仪,不进行任何计算。请帮忙!

  • 我正在尝试将数字从十进制值转换为其IEEE 752形式。例如: 我写了这个方法: 有个问题我解决不了,我再举个例子说清楚。 但是当数字为负数时,例如 我收到以下错误: 这意味着我的代码可以完美地处理正数(包括零),但如果是负数,代码就会崩溃。问题出在哪里? 笔记 我想我可以用这种方式解决我的问题 检查是否有一个字符At(0)等于1 如果是(numero.charAt(0)==1),则删除第一个字符

  • 我想知道如何将舞蹈方法的十进制结果包含到灯光方法中。例如,在这个程序中,如果我输入5F,十进制结果将是95。我希望95在light方法中显示为静态int变量,以便转换为二进制数。如果你能告诉我如何将十六进制数限制在2位数以内,那也会很有帮助。感谢阅读! } }

  • 本文向大家介绍如何将十六进制转换为十进制?,包括了如何将十六进制转换为十进制?的使用技巧和注意事项,需要的朋友参考一下 而十六进制数是具有值是16的数字系统中的一个并且它具有唯一的16个码元:0,1,2,3,4,5,6,7,8,9和A,B,C,d,E ,其中A,B,C,D,E和F分别是十进制值10、11、12、13、14和15的单位表示。而十进制系统是最熟悉的号码系统向公众开放。它是10的基数,只

  • 本文向大家介绍如何将十进制转换为十六进制?,包括了如何将十进制转换为十六进制?的使用技巧和注意事项,需要的朋友参考一下 十进制是公众最熟悉的数字系统。它是基数10,只有10个符号-0、1、2、3、4、5、6、7、8和9。而十六进制是计算机或数字系统中最常见的数字系统颜色表示。它是基数16,只有16个符号:0、1、2、3、4、5、6、7、8、9和A,B,C,D,E,F。这些A,B,C,D ,E,F分

  • 我有一个二进制数,表示为11.1111111(与小数点类似)。点前有2位,点后有1024位。这是一个将e计算到高精度的练习,但现在我被困在如何将其转换为十进制的问题上。万一你们想知道号码,就在这里: 如何将其转换为2.718。。。。(小数点后应该有309位左右)我不能简单地将每一位乘以2^x,因为一段时间后,数字2^x将=0,即使使用双精度浮点。我使用的是Visual Basic,所以我不确定是否

  • 问题内容: 我想知道如何在Python中将小数转换为最低形式的分数。 例如: 问题答案: 您有两种选择: 用途: (1, 4) (从Python 3.6开始,您可以对对象执行相同的操作。) 使用类型: Fraction(0.25) Fraction(1, 4) 后者具有非常有用的转换: 由于浮点值可能不精确,因此您可能会得到“奇怪”的分数;限制分母以某种程度“简化”分数,方法是: 如果您仍在使用P