鱼C论坛

 找回密码
 立即注册
查看: 3130|回复: 16

[已解决]我有一个问题

[复制链接]
发表于 2022-9-15 18:38:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大佬们,为什么
#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 20:00:24
        下面的代码可以证明我的解释
#include<stdio.h>
int main(void)
{
        int a                  ;
        scanf("%c" , & a)      ;
        printf("%d", a & 0xff) ; // 二进制操作,取用变量 a 的第 4 个字节,把前 3 个字节置 0
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-15 18:42:32 | 显示全部楼层
都可以转换啊 , 第一个代码没问题的
转换就是把这个字符的 ascii 码打出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-15 18:48:19 | 显示全部楼层
         在计算机内部,所有信息都是用数字进行记录的,其中,ASCII 字符一共128个,对应的编码范围是 0~127,在 ASCII 编码的范围内,可以说字符就是数字,数字就是字符,例如,数字 49 和 65 分别对应于字符 '0' 和 'A',在 printf() 中,用 "%d" 进行显示,就是整型数 49 和 65,如果用 "%c" 进行显示,就是字符 '0' 和 'A'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第一个我用dev编译的,不行,比如说我输入1,打印出来是1643825
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我想问的是为什么不能把字符转换为整型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-15 19:01:03 | 显示全部楼层
正天圣人 发表于 2022-9-15 18:52
我想问的是为什么不能把字符转换为整型

       字符转换为整型是什么意思?把 '5' 转变成 5 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-15 19:11:53 | 显示全部楼层
jackz007 发表于 2022-9-15 19:01
字符转换为整型是什么意思?把 '5' 转变成 5 ?

对,但是第一个代码不是这么运作的,为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-15 19:12:41 | 显示全部楼层
jackz007 发表于 2022-9-15 19:01
字符转换为整型是什么意思?把 '5' 转变成 5 ?

也不完全是,就是‘a’转换为97这种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-15 19:24:32 | 显示全部楼层
jackz007 发表于 2022-9-15 19:18
给你说了半天字符就是数字,数字就是字符,'a' 就是 97,97 就是 'a',编译、运行一下下面的代码你 ...

大佬,你这个代码行,可是为什么我的第一个代码执行输入a之后打印的数字是8位数字,而且数字是随机的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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) ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

可是大佬,如果4个字节中有一个是有效的,那至少会打印97或者9和7吧,可是我的第一个代码有时候9和7都没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

         11 楼的代码运行结果是否符合预期?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-15 19:58:50 | 显示全部楼层
jackz007 发表于 2022-9-15 19:52
11 楼的代码运行结果是否符合预期?

11楼可以,但是我想知道到底为什么我的第一个代码不行,如果4个字节中有一个是有效的,那至少会打印97或者9和7吧,可是我的第一个代码有时候9和7都没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-15 20:05:34 | 显示全部楼层
jackz007 发表于 2022-9-15 20:00
下面的代码可以证明我的解释

谢谢大佬,我懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-15 20:09:18 From FishC Mobile | 显示全部楼层
正天圣人 发表于 2022-9-15 20:05
谢谢大佬,我懂了

       其实,所有的麻烦都来自对 a 的定义,因为你把它定义成了 int,如果你把它定义成 char,那就不会有任何问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 05:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表