整形提升与原反补码


前言

关于二进制原码、反码、补码和整型提升的运用


练习一

#include <stdio.h>

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1
	printf("a=%d, b=%d, c=%d", a, b, c);
	// 你知道输出结果是什么吗?
	
	return 0;
}

解析:

上述输出结果为:a=-1, b=-1, c=255
int main()
{
	首先我们先看-1的原反补码
	10000000 00000000 00000000 00000001 - -1的原码
	11111111 11111111 11111111 11111110 - -1的反码
	11111111 11111111 11111111 11111111 - -1的补码

	char a = -1; // char类型占据一个字节的内存空间
	所以a地址中存储的二进制序列是:11111111	
	当我们打印时,因类型不同,所以要进行整型提升
	整型提升:若有符号位,则高位补符号位,即为1
	11111111 11111111 11111111 11111111 - 整形提升后的补码
	10000000 00000000 00000000 00000001 - 整形提升后的原码 - 打印-1

	signed char b = -1; 
	b地址中存储的二进制序列是:11111111	
	整型提升:若有符号位,则高位补符号位,即为1
	11111111 11111111 11111111 11111111 - 整形提升后的补码
	10000000 00000000 00000000 00000001 - 整形提升后的原码 - 打印-1

	unsigned char c = -1;
	c地址中存储的二进制序列是:11111111
	整型提升:无符号位,则高位补0
	00000000 00000000 00000000 11111111 整形提升后的补码 - 正数原反补相同
	00000000 00000000 00000000 11111111 整形提升后的原码 - 打印255

	return 0;
}

练习二

#include <stdio.h>

int main()
{
	char a = -128;
	// %u 输出无符号10进制整数
	printf("%u", a);
	// 你知道输出的结果吗?
	
	return 0;

}

解析:

上述输出结果为:4294967168
int main()
{
	首先我们先-128的原反补码
	10000000 00000000 00000000 10000000 - -128的原码
	11111111 11111111 11111111 01111111 - -128的反码
	11111111 11111111 11111111 10000000 - -128的补码
	
	char a = -128;
	a地址中存储的二进制序列是:10000000
	整形提升:若有符号位,高位补符号位,即为1
	11111111 11111111 11111111 10000000 - 整型提升后的补码
	因为打印的是无符号位的整数,把它当作正数,正数的原反补均相同,则输出结果为:4294967168
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值