八义士 发表于 2024-9-22 21:32:46

十进制转换二进制的输出问题

本帖最后由 八义士 于 2024-9-22 21:34 编辑

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char arr;

void tenTotwo(int x)
{
        int length = 0;
        while (x)
        {
                arr=x%2;
                x /= 2;
        }
        for (int i = length - 1; i >= 0; i--)
                printf("%d", arr);
}
int main(void)
{
       
        int b;
        printf("input a integer num\n");
        scanf("%d",&b);
        tenTotwo(b);
        system("pause");
        return 0;
}
函数输出是为什么是%d,而不是%c


FishC 发表于 2024-9-22 21:32:55

你所描述的问题及代码有多个错误,我会逐步指出并修改以确保其能够正确运行,同时回答你的问题。

首先,修改代码中存在的问题和错误:

1. 编译器警告 `_CRT_SECURE_NO_WARNINGS` 通常用于禁用某些安全性的编译器警告,对于此示例可以忽略不处理。
2. `#include` 没有指定头文件,应该补上 `<stdio.h>` 和 `<stdlib.h>`.
3. `char arr;` 应该定义成一个数组来存储二进制位,不然数组越界。
4. `tenTotwo` 函数中计算二进制时,没有增加 `length` 的值。
5. `for` 循环中的 `arr` 应该是数组,不是单个字符。
6. `tenTotwo(int x)` 在 `main` 函数中的调用不正确。
7. 问题出在输出二进制位时需要使用 `%d` 来输出整型数值,而不是 `%c`。

我来修正并解释这段代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void tenTotwo(int x)
{
    int arr; // 定义一个数组来存储二进制位,32位足够表示所有的int
    int length = 0;

    while (x)
    {
      arr = x % 2;
      x /= 2;
      length++;
    }

    for (int i = length - 1; i >= 0; i--)
    {
      printf("%d", arr); // 这里使用 %d 因为我们输出的是整数
    }
    printf("\n");
}

int main(void)
{
    int b;
    printf("Input an integer number\n");
    scanf("%d", &b);
    tenTotwo(b); // 正确调用函数
    system("pause"); // windows系统下暂停程序
    return 0;
}

解释关键点:
1. 使用整型数组存储每一位二进制数,因为 `char` 类型会导致错误。
2. `length` 用来记录数组中存储了多少个二进制位。
3. 用 `%d` 输出是因为我们存储的二进制位实质上是整型数值 0 或 1,不是字符。

这样修改后,程序就能够正确把十进制整数转换为二进制,并且按正确顺序输出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-9-23 10:54:31

本帖最后由 jackz007 于 2024-9-23 23:44 编辑

      计算机用编码来表达字符,ASCII 编码的范围为 0 - 127,分别代表 128 个不同的 ASCII 字符,所以,可以说,字符就是数字。
      例如,当以 "%c" 来输出变量 v 时,那是需要按字符的形式输出 ASCII 编码为 v 的字符;当以 "%d" 来输出变量 v 时,那是需要按十进制整数的形式输出 v 的数值。
      请参考下面的代码加深理解:
#include <stdio.h>

int main(void)
{
      char c = 65      ; // 字符 'A' 的 ASCII 编码为 65
      printf("%d\n" , c) ; // 输出数值 65
      printf("%c\n" , c) ; // 输出字符 'A', ASCII 编码 65 的字符是 'A'      
      c = 'c'            ; // 字符 'c' 的 ASCII 编码为 99
      printf("%d\n" , c) ; // 输出数值 99,字符 'c' 的 ASCII 编码为 99
      printf("%c\n" , c) ; // 输出字符 'c'               
}
页: [1]
查看完整版本: 十进制转换二进制的输出问题