为什么C语言1089格式化字符打印出A
为什么C语言1089打印出A
我相信很多刚学习C语言的朋友,对于学习的一些困惑,不过不着急,可以慢慢分析
我们先上一个例子来看看
# include <stdio.h>
int main() {
char a,b,c;
int d;
a = '\5';
b = '\60';
c = 'A';
d = 1089;
printf("a=%c,b=%c,c=%d,d=%c", a,b,c,d);
return 0;
}
运行看结果为
a=║,b=0,c=65,d=A
此时产生疑问,为什么 1089 等于 A
需要先了解一个知识点,
数据类型
int
数据类型在C语言中占用两个字节
而我们打印的\c
格式化为字符类型
在C语言中字符型使用 \c
来格式化,字符串使用\s
来格式化
字符型的内容是占用的单字节也就是说
我们格式化的内容是占用一个字节
我们可以明白,是存在数据丢失问题。或者是说强制类型转换丢失数据。
计算机中 是使用二进制进行存储计算操作的
> 而二进制存储,对于int类型 C语言默认是有符号位的,但是无论是否是有符号位
> 它的二进制表示形式都是占据三个字节
> 也就是`0000 0100 0100 0001`但是我们知道`int`类型占用两个字节,
> 而我们格式化进行输出字符型的时候,超出部分则直接舍弃
> 得到的值实际上为 `0100 0001`
> 通过`ASCII Code`得到的十进制数为 65 映射的码值为大写字母`A`
为此我们测试一下
测试1、
首先单字节不用测试,
既然是舍弃,也就是说,只要我们保持低位字节是0100 0001
进行转换就一定是大写字母A
二进制:
0000 0001 0100 0001
十进制:321
二进制:0000 0011 0100 0001
十进制:833
二进制:0000 0111 0100 0001
十进制:1857
二进制:0000 1111 0100 0001
十进制:3905
二进制:0001 1111 0100 0001
十进制:8001
二进制:0011 1111 0100 0001
十进制:12097
# include <stdio.h>
int main() {
int a,b,c,d;
a = 321;
b = 833;
c = 1857;
d = 3905;
e = 8001;
f = 12097;
printf("a=%c,b=%c,c=%c,d=%c,e=%c,f=%c", a,b,c,d,e,f);
return 0;
}
得出结果
a=A,b=A,c=A,d=A,e=A,f=A
说明偏向我们证实的一部分
测试2、
好了不用测试了,实际上懒的再继续测试了,哈哈哈
不过逻辑上与我所证实的是相同的,大家可以,在单字节的基础上,对于以上的内容继续进行处理,但是有一点需要注意
对于计算机或者人为要求上,最大正数进行上溢舍弃逻辑上是会报错的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构