关于无符号数的原反补码以及整型提升

关于无符号数的原反补码以及整型提升:

先介绍一下原码、反码、补码:
十进制的数转化为二进制就是原码了,第一位是符号位(1是负、0是正),无符号数就是叫你别管第一位,原码除了符号位全部0变1、1变0就是反码了,反码+1就是补码了,而计算机中的存储及运算都是按补码的,搞定。

再简单介绍一下整型提升:
整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整型首先要提升为int类型再送入cpu执行计算,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。–百度百科
我补充一点:是变量的补码进行整型提升,补符号位值补至4个字节即32个bit位。

好了,分别举一个栗子,一目了然,
下面是一段简短的c语言代码

#include <stdio.h>
int main()
{
	signed char a = -1;//有符号数 字符变量a
	unsigned char b = -1;//无符号数 字符变量b
	printf("%d,%d", a, b);//结果为-1,255
	return 0;
}
  1. 输出 signed char a 的过程:
    signed char a 的原码 10000001(char类型是8个bit位)
    反码 11111110
    补码 11111111
    使用 C库函数 printf 将 char 类型变量格式化输出到标准输出 stdout 时会先对 char 变量进行整形提升
    整形提升后(提升至32个bit位):
    补码 11111111111111111111111111111111
    反码 11111111111111111111111111111110
    原码 10000000000000000000000000000001(即-1,输出的-1就是这么来的)

  2. 输出 unsigned char b 的过程:
    unsigned char b 的原码 10000001
    反码 11111110
    补码 11111111
    同上,会发生整形提升。
    因为是无符号数所以整形提升的时候当成正数补0。
    整形提升后:
    补码 00000000000000000000000011111111
    反码 00000000000000000000000011111111(无符号数和正数的原码、反码、补码相同)
    原码 00000000000000000000000011111111(即255,输出的255就是这么来的)

感谢阅读~~~

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

琴kk

给我一点点鼓励吧

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

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

打赏作者

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

抵扣说明:

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

余额充值