前言
今天我们一起来了解一下关于整形提升和进制转换的问题
经典例题
典例1
计算下面程序打印的结果
#include<stdio.h>
int main(){
char a=-1;//字符类型
signed char b=-1;//有符号字符类型
unsigned char c=-1;//无符号字符类型
printf("%d %d %d\n",a,b,c);
return 0;
}
先仔细读题:题目中给出三个字符型变量a、b、c,但同时他们的类型又略有不同,最后的结果都为%d(整形)类型。
![在这里插入图片描述](https://img-blog.csdnimg.cn/71bb31cc6aff4c53885c529fae714959.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/efb903d09755426ca8b5e34f1449fd17.png)
运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a0d7b3b2e65a4152b0f4f3fee5cd690c.png)
由上题可知,数据的值与它本身的类型有着很大的关系,那下面我们对上题进行一下修改来看看会有什么不同吧!
变式1
计算下面程序打印的结果
#include<stdio.h>
int main(){
char a=-1;//字符类型
signed char b=-1;//有符号字符类型
unsigned char c=-1;//无符号字符类型
printf("%u %u %u\n",a,b,c);
return 0;
}
这里我们将打印类型改为了%u(无符号整形),下面继续让我们来画图探究结果。
![在这里插入图片描述](https://img-blog.csdnimg.cn/48032fc776fa423c8ee0af08ff2358de.png)
运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/dbf33a3075fe4a779d08c82db3ac592d.png)
由上我们可以得出数值的打印既和数据原来的类型有关,也和打印出来的类型也有关。
%u 是打印无符号数,认为内存中存放的是无符号数
%d 是打印有符号数,认为内存中存放的是有符号数
整形提升时看的是数据原本的类型
有符号数补充符号位
无符号数补 0
打印的时候看打印时设定的类型
典例2
计算下面程序打印的结果
#include<stdio.h>
int main(){
char ch = -128;
printf("%d\n", ch);
printf("%u\n", ch);
return 0;
}
我们已经知道char == signed char ,它的取值范围为-128~127
这里分别以%d和%u的形式打印,就让我们继续画图分析。
![在这里插入图片描述](https://img-blog.csdnimg.cn/431c71531fe44aa088a5a975b568dcf9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/068a00edc39643718c350c664d42e12d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/e4603db0a9924a8a84e6b9b0a97d96e8.png)
总结
以上就是今天我们要讲解的几道题目,这里熊猫想提醒大家的是,一个数据在 存储 和 取出 的时候不可以简单的认为自己看到的是多少就是多少,他和数据本身的类型和打印解析时的类型也有很大关系,希望大家和我在以后遇到这种问题是可以想到今天我们讲的这些内容。
在此感谢大家对
的支持,这是熊猫持续更新的巨大推进力!