为什么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、

好了不用测试了,实际上懒的再继续测试了,哈哈哈

不过逻辑上与我所证实的是相同的,大家可以,在单字节的基础上,对于以上的内容继续进行处理,但是有一点需要注意

对于计算机或者人为要求上,最大正数进行上溢舍弃逻辑上是会报错的。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值