在日常生活中,我们知道,加上一个负数,等于减去这个负数的绝对值。
那么在C++里,是否和我们平时的认知是一样的呢?
//*******************************************************************************************************
看一段小代码:
int i=-42;
unsigned j=10;
std::cout<<i+j<<std::endl;
这个代码的输出结果是什么呢?
和平时的答案不太一样吧。下面就来探究一下原因。
//*************************************************************************************************************************
因为在机器中,所有的data都是由二进制数来保存,所以此时先将-42转换为二进制数。
这时要注意,int型在机器里是32位存储,所以此时,在101010前面还有25个0,然后第一位是一个1,代表是负数。
所以,此时的-42完全转换为int的二进制形式是:10000000000000000000000000101010.
然后再取反码:除符号位外,其余位取反,即为:11111111111111111111111111010101.
再取补码:在反码的基础上+1,即为: 11111111111111111111111111010110.
好了,处理完int型,现在处理unsigned型。
已知unsigned型为10,则转化为二进制是:
同理,此时前面均为0,所以其二进制就是1010.
现在两个数都处理完了,接下来进行加和。
11111111111111111111111111010110 + 1010
根据二进制逢二进一,可以得出结果为: 11111111111111111111111111100000
化成十进制,既得到结果。
//*********************************************************************************************************************
由此可知:
1.机器中储存负数是储存其补码,要掌握补码计算过程;
2.int型数化unsigned型数的方法过程;
3.计算机中的基本编译储存原理。