这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!
整形在内存中的存储
整形在内存中以补码形式存储
原因:
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,
可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,
其运算过程是相同的,不需要额外的硬件电路
1 + (-1)
假设使用原码计算:
1的原码: 00000000 00000000 00000000 00000001
-1的原码: 10000000 00000000 00000000 00000001
-----------------------------------------
10000000 00000000 00000000 00000010 ->-2
所以1+(-1) -2 //err
1 + (-1)
假设使用补码计算
1的原码:00000000 00000000 00000000 00000001
1的补码:00000000 00000000 00000000 00000001
正数原反补相同
-1的原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
两个补码运算
00000000 00000000 00000000 00000001
+ 11111111 11111111 11111111 11111111
-----------------------------------------
1 00000000 00000000 00000000 00000000
计算出进位,有33位,但是只取32位->结果为0
原码反码补码
已知补码求原码:
方法1:对补码A求补码B, 求出的补码B就是补码A的原码
方法2:
补码-1 ->反码
反码按位取反(符号位不变)->得到原码
例:
已知补码:11111111 11111111 11111111 11111111 求原码
11111111 11111111 11111111 11111111
方法1:对补码再求补码,把要求的补码当成原码,求出来的补码就是原码
11111111 11111111 11111111 11111111-原码
10000000 00000000 00000000 00000000-反码
10000000 00000000 00000000 00000001-补码
得出的该补码10000000 00000000 00000000 00000001,就是要求的11111111 11111111 11111111 11111111补码的原码->值为-1
方法2:
补码 - 1 -> 反码
11111111 11111111 11111111 11111110 ->反码
反码按位取反(符号位不变) ->原码
10000000 00000000 00000000 00000001 ->原码
该原码的值为-1
今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!