C++中负数的二进制编码表示从何而来?

关键词:源码,反码,补码,unsigned
int a=32;
32 的二进制编码为 00000000 00000000 00000000 00100000
那 -32的二进制编码是什么呢?先告诉答案:用补码表示
要解决这个问题,咱们先来看几个概念——源码,反码,补码。
源码:对负数而言其源码为取绝对值的二进制编码并且符号位改为1。
-32的源码: 10000000 00000000 00000000 00100000
反码:正数的反码和源码相同。负数则为源码除符号位的位数取反。
-32的反码: 11111111 11111111 11111111 11011111
补码:正数的补码和源码相同。负数则为反码加1
-32的补码: 11111111 11111111 11111111 11100000
-32的二进制编码:11111111 11111111 11111111 11100000
总结来说:(1)负数的源码与其绝对值的源码相同。
(2)正数的反码与源码相同。负数的反码为源码除符号位的位数取反。
(3)正数的补码与源码相同。负数的补码则为反码加1

那给你一串二进制编码你知道表示什么数吗?例如
11111111 11111111 11111111 10100000 (int 类型)
(1)负数
(2)减1 11111111 11111111 11111111 10011111
(3)取反 10000000 00000000 00000000 01100000
(4)计算 -96

但是如果是11111111 11111111 11111111 10100000 (unsigned int 类型)
又表示什么数?
此数为正数 4,294,967,072

int a=10; unsigned b=42;
a-b等于-32吗?不对正确答案为 4,294,967,264 ?
运算期间会发生强制类型转换,signed类型变成unsighed类型,
运算结果为unsigned类型
-32 的二进制编码为 11111111 11111111 11111111 11100000
因为无符号,自能为正数。此编码表示的正数为4,294,967,264
要特别注意unsigned类型的值与signed类型的值之间的运算

猜你喜欢

转载自blog.csdn.net/ssf_cxdm/article/details/79352800