正负整数小数在内存的存储 |
您所在的位置:网站首页 › 7fffffff十进制 › 正负整数小数在内存的存储 |
目录 补码引入 整数在内存的存储 小数十进制与二进制相互转化 小数的内存存储 本节会主要学习正负的整数小数在内存的存储方式 补码引入补码在计算机有着重要的地位,计算机本身只能完成的加法,移位运算,减法,乘法,除法计算的实现是需要借助补码进行实现的。乘法运算的实现是通过移位和加法的结合,除法转换为i乘法。 观察下面的程序,第一想法是这个程序是不会停下的,但是学习过补码的人都知道,当n=2147483648时就会停止。 #include int main() { int n=1; while(n > 0) { n++; } printf("%x\r\n",n); // 16进制输出数据 return 0; }运行结果:内存地址,数据的16进制,10进制表示 使用WinHex查看内存情况,工具出了毛病,找不到内存的Hello.exe进程 循环退出时,n的十六进制是 0000 0000 8000 0000 这里是8字节存储单元 数据在内存的存储的最高位表示符号,及正负,当循环执行n迭代到2147483647时 其二进制值是: 01111111111111111111111111111111 再次加1,就会变为 1000000000000000000000000000 此时就会变成一个负数,0在补码已经有了表示,所以这个二进制表示的是一个负数 补码 80000000 在 32 位补码表示中表示的是最小的负数,其对应的十进制值是 -2147483648。 在计算补码的十进制值时,首先要确定补码的符号位。在这种情况下,符号位为 1,表示负数。 接下来,我们将剩余的位取反(包括符号位),得到补码的反码。对于补码 80000000,其反码为 7FFFFFFF。 最后,将反码转换为对应的十进制值,并在最终结果前加负号。对于补码 7FFFFFFF,其对应的十进制值为 -2147483647。由于补码的范围是对称的,所以最小的负数的绝对值比其他负数的绝对值大一。 整数在内存的存储 #include int main() { int n = 678; int m = -678; printf("%p \n",&n); printf("%x \n",n); printf("%p \n",&m); printf("%x \n",m); system("pause"); return 0; }x64dbg中查看内存的存储,因为代码中的m,n都是int数据类型,所以我们只需要看存储单元的低位4字节 678 -678 在内存中看到很高位的数字比较大,多半是个负数,高位较低,多半是一个整数。 小数十进制与二进制相互转化小数转二进制 以0.75为例子,方法一 以0.6为例,方法二 二进制转小数 0.11 = 1*2^-1 + 1*2^-2 = 0.5+0.25=0.75 小数的内存存储根据下面的一个例子学习小数在内存的存储,一个float数据,4个字节,即是32位,8个16进制数 其存储的格式大致如下: S EEEEEEEE DDDDDDDDDDDDDDDDDDDDDDD S位标识符号位,8个E表示小数点意味,23个D表示小数 1.10111111111 * 10^9 S EEEEEEEE DDDDDDDDDDDDDDDDDDDDDDD 0 10001000 10111111111000000000000 S为0整数,10001000是127+9=128+8=10000000+1000=10001000 按4为一个16进制数字转化为一串16进制值 0100 0100 0101 1111 1111 0000 0000 0000 4 4 5 f f 0 0 0 445FF000 代码如下: #include int main() { float n = 895.75f; float m = -895.75f; printf("%p \n",&n); printf("%p \n",&m); system("pause"); return 0; }float也是4个字节,所以只需要关注低位4字节即可 895.75 -895.75 这里在00000B9EC7CF990,之后的8个字节把正负数存储在一起了。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |