正天圣人 发表于 2022-9-15 18:38:29

我有一个问题

大佬们,为什么
#include<stdio.h>
int main()
{
        int a;
        scanf("%c",&a);
        printf("%d",a);
}
不能把字符转换为整型,而
#include<stdio.h>
int main()
{
        int a;
        scanf("%d",&a);
        printf("%c",a);
}
可以把整型转换为字符啊?原理是什么呢?

柿子饼同学 发表于 2022-9-15 18:42:32

都可以转换啊 , 第一个代码没问题的
转换就是把这个字符的 ascii 码打出来

jackz007 发表于 2022-9-15 18:48:19

         在计算机内部,所有信息都是用数字进行记录的,其中,ASCII 字符一共128个,对应的编码范围是 0~127,在 ASCII 编码的范围内,可以说字符就是数字,数字就是字符,例如,数字 49 和 65 分别对应于字符 '0' 和 'A',在 printf() 中,用 "%d" 进行显示,就是整型数 49 和 65,如果用 "%c" 进行显示,就是字符 '0' 和 'A'。

正天圣人 发表于 2022-9-15 18:52:12

柿子饼同学 发表于 2022-9-15 18:42
都可以转换啊 , 第一个代码没问题的
转换就是把这个字符的 ascii 码打出来

第一个我用dev编译的,不行,比如说我输入1,打印出来是1643825

正天圣人 发表于 2022-9-15 18:52:55

jackz007 发表于 2022-9-15 18:48
在计算机内部,所有信息都是用数字进行记录的,其中,ASCII 字符一共128个,对应的编码范围是 0~ ...

我想问的是为什么不能把字符转换为整型

jackz007 发表于 2022-9-15 19:01:03

正天圣人 发表于 2022-9-15 18:52
我想问的是为什么不能把字符转换为整型

       字符转换为整型是什么意思?把 '5' 转变成 5 ?

正天圣人 发表于 2022-9-15 19:11:53

jackz007 发表于 2022-9-15 19:01
字符转换为整型是什么意思?把 '5' 转变成 5 ?

对,但是第一个代码不是这么运作的,为什么?

正天圣人 发表于 2022-9-15 19:12:41

jackz007 发表于 2022-9-15 19:01
字符转换为整型是什么意思?把 '5' 转变成 5 ?

也不完全是,就是‘a’转换为97这种

jackz007 发表于 2022-9-15 19:18:14

本帖最后由 jackz007 于 2022-9-15 19:23 编辑

      给你说了半天字符就是数字,数字就是字符,'a' 就是 97,97 就是 'a',编译、运行一下下面的代码你就明白了。
#include <stdio.h>

int main(void)
{
      char c = 'a'       ;
      printf("%d\n" , c) ;
}
       就是说,字符 'a' 就是数字 97 本身,无需做任何变换,只有把数字 97 当成字符("%c")来显示的时候,它才是 'a'。

正天圣人 发表于 2022-9-15 19:24:32

jackz007 发表于 2022-9-15 19:18
给你说了半天字符就是数字,数字就是字符,'a' 就是 97,97 就是 'a',编译、运行一下下面的代码你 ...

大佬,你这个代码行,可是为什么我的第一个代码执行输入a之后打印的数字是8位数字,而且数字是随机的?

jackz007 发表于 2022-9-15 19:32:29

正天圣人 发表于 2022-9-15 19:24
大佬,你这个代码行,可是为什么我的第一个代码执行输入a之后打印的数字是8位数字,而且数字是随机的?

      因为你定义的 a 是一个整型数,一个整型数占用的是 4 个字节,scanf("%c" , & a) 拿到的 a 只有一个字节,当你用 printf("%d" , a) 显示 a 的时候,是按 4 个字节来显示的,这 4 个字节中,只有一个是有效的,其余 3 个都是无效的,所以,你看到了莫名其妙的数值,只要在 printf() 中强调一下对 a 按 char 类型变量进行显示就可以解决问题
#include<stdio.h>
int main(void)
{
      int a                  ;
      scanf("%c" , & a)      ;
      printf("%d", (char) a) ;
}

正天圣人 发表于 2022-9-15 19:39:06

jackz007 发表于 2022-9-15 19:32
因为你定义的 a 是一个整型数,一个整型数占用的是 4 个字节,scanf("%c" , & a) 拿到的 a 只有 ...

可是大佬,如果4个字节中有一个是有效的,那至少会打印97或者9和7吧,可是我的第一个代码有时候9和7都没有

jackz007 发表于 2022-9-15 19:52:17

正天圣人 发表于 2022-9-15 19:39
可是大佬,如果4个字节中有一个是有效的,那至少会打印97或者9和7吧,可是我的第一个代码有时候9和7都没 ...

         11 楼的代码运行结果是否符合预期?

正天圣人 发表于 2022-9-15 19:58:50

jackz007 发表于 2022-9-15 19:52
11 楼的代码运行结果是否符合预期?

11楼可以,但是我想知道到底为什么我的第一个代码不行,如果4个字节中有一个是有效的,那至少会打印97或者9和7吧,可是我的第一个代码有时候9和7都没有

jackz007 发表于 2022-9-15 20:00:24

      下面的代码可以证明我的解释
#include<stdio.h>
int main(void)
{
      int a                  ;
      scanf("%c" , & a)      ;
      printf("%d", a & 0xff) ; // 二进制操作,取用变量 a 的第 4 个字节,把前 3 个字节置 0
}

正天圣人 发表于 2022-9-15 20:05:34

jackz007 发表于 2022-9-15 20:00
下面的代码可以证明我的解释

谢谢大佬,我懂了

jackz007 发表于 2022-9-15 20:09:18

正天圣人 发表于 2022-9-15 20:05
谢谢大佬,我懂了

       其实,所有的麻烦都来自对 a 的定义,因为你把它定义成了 int,如果你把它定义成 char,那就不会有任何问题。
页: [1]
查看完整版本: 我有一个问题