【C语言】分析整型提升|截断

这里通过例子来帮助理解整型提升和截断的规则。
问题:

  1. 赋值过程是怎样的?什么情况会发生截断?
  2. 整型提升的规则是什么? 根据什么类型来提升?
  3. %d, %u对整型提升后的结果有什么影响?

例一

#include <stdio.h>
int main()
{
	char a = -128;
	printf("%d\n", a);
	printf("%u\n", a);
	return 0;
}

运行这段代码的结果如下:
在这里插入图片描述
char如果不加unsigned默认是有符号类型。
为什么会出现两种不同的结果?
分析:

  1. -128是一个4字节整型,在内存中存储它的补码。
    原码
    1000 0000 0000 0000 0000 0000 1000 0000
    反码(符号位不变,其余取反)
    1111 1111 1111 1111 1111 1111 0111 1111
    补码 (反码+1)
    1111 1111 1111 1111 1111 1111 1000 0000
  2. char a = -128;
    这一步发生截断,将-128的补码后8位赋给a
    1111 1111 1111 1111 1111 1111 1000 0000
  3. 以%d打印的是有符号数:
    这一步将会发生整型提升,提升规则:如果a是有符号数,将a的高位识别为符号位,按照符号位提升到32位。
    a是 1000 0000
    提升后 1111 1111 1111 1111 1111 1111 1000 0000
    %d以有符号识别1111 1111 1111 1111 1111 1111 1000 0000,将被识别成补码形式。所以打印结果就是-128。
  4. 以%u打印的是无符号数:
    这里会发生整型提升, 提升规则:如果a是有符号数,将a的高位识别为符号位,按照符号位提升到32位。
    a是 1000 0000
    提升后 1111 1111 1111 1111 1111 1111 1000 0000
    %u以无符号数识别1111 1111 1111 1111 1111 1111 1000 0000,将被识别成原码形式,打印结果就是4294967168。

例二

#include <stdio.h>
int main()
{
	unsigned char a = -1;
	printf("%d\n", a);
	printf("%u\n", a);
	return 0;
}

结果:
在这里插入图片描述
分析:

  1. -1的原码、反码、补码:
    1000 0000 0000 0000 0000 0000 0000 0001
    1111 1111 1111 1111 1111 1111 1111 1110
    1111 1111 1111 1111 1111 1111 1111 1111
  2. unsigned char a = -1;
    发生截断:
    1111 1111 1111 1111 1111 1111 1111 1111
    a 为1111 1111
  3. %d以有符号类型识别整型提升后的"补码":
    由于a是无符号数,整型提升在前面补0即可,没有符号位,不看符号位。
    提升后:0000 0000 0000 0000 0000 0000 1111 1111
    提升后的a识别为补码,因此结果是255
  4. %u以无符号数识别整型提升后的"原码":
    由于a是无符号数,整型提升在前面补0即可,没有符号位,不看符号位。
    提升后:0000 0000 0000 0000 0000 0000 1111 1111
    将提升后的a识别为原码,打印结果就是255
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值