十进制转换二进制的输出问题
本帖最后由 八义士 于 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
你所描述的问题及代码有多个错误,我会逐步指出并修改以确保其能够正确运行,同时回答你的问题。
首先,修改代码中存在的问题和错误:
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 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]