在VS内存窗口中观察负数在内存的存储形式
C++有符号整型数据为4个字节,数值范围为-2147483648~+2147483647,好奇这个范围于是研究了一下
首先要了解负数在计算机中的存储形式,负数在计算机中是以补码的形式存储的,原因是为了方便计算机做减法,例如:
数值范围以单字节整型数据为例:
-1的原码是1000 0001(第一位代表符号位,正数是0,负数是1)
-1的反码是1111 1110(反码是原码按位取反,第一位符号位不参与)
-1的补码是1111 1111(补码就是反码加1)
所以单字节有符号的正数可以存储1~127,即0000 0000~0111 1111;
单字节有符号的负数可以存储-127~-1,即1000 0001~1111 1111(反码为1000 0000~1111 1110==》原码为1111 1111~1000 0001)
可以观察到还有个+0和-0,0000 0000表示+0,1000 0000表示-0表示-128
综上单字节数值范围为-128~127,同理可得4字节整型数据数值范围为-~-1,即-2147483648~+2147483647
接下来在VS2015中观察验证
#include <iostream>
using namespace std;
int main()
{
int i = -127;//观察-127在计算机中的存储形式,补码的16进制为81,二进制为1000 0001
cout << i << endl;
return 0;
}
首先观察变量i在内存中16进制存储形式如下:
对内存窗口中存储序列具体内容不是很清楚,初步判断三个ff前面的81为-127在内存中的存储,这也与它的补码1000 0001相同,接下来通过更改变量数值来验证,将-127改成-128 ,观察如下:
这时内存1全是???可以打开内存2(为什么内存1观察不到)可以看到-128的存储形式80为它的补码1000 0000且刚好还是在这个位置,所以认为这里是变量i的数值在内存的存储位置
问了度娘看到不少帖子说可以通过添加监视来观察他在内存中的情况,于是对变量i添加监视
监视中值列的数值即为它的地址(帖子里这样说的),复制它的值到内存窗口,但是搜索不到-127或者-128的16进制补码,甚至在内存1,内存2,内存3中都找不到任何有效数值,这时添加内存4,在不粘贴i的地址的情况下还是可以查到-128的16进制补码,复制粘贴地址之后又找不到81或是80,看了一些其他帖子也不明白问题出在哪里
总而言之,还是可以确切观察到负数在计算机中是以补码的形式存储的,其他的问题慢慢解决吧~~~