正负整数小数在内存的存储

文章介绍了补码的概念及其在计算机中实现加减乘除运算的重要性,通过实例解释了整数如何在内存中以补码形式存储,特别是当数值达到边界时如何从正数变为负数。同时,讨论了小数的二进制转换以及浮点数在内存中的存储布局,包括符号位、指数和尾数的表示。
摘要由CSDN通过智能技术生成

目录

补码引入

整数在内存的存储

小数十进制与二进制相互转化

小数的内存存储


本节会主要学习正负的整数小数在内存的存储方式

补码引入

补码在计算机有着重要的地位,计算机本身只能完成的加法,移位运算,减法,乘法,除法计算的实现是需要借助补码进行实现的。乘法运算的实现是通过移位和加法的结合,除法转换为i乘法。

观察下面的程序,第一想法是这个程序是不会停下的,但是学习过补码的人都知道,当n=2147483648时就会停止。

#include<stdio.h>

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<stdio.h>

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<stdio.h>

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个字节把正负数存储在一起了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dao-道法自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值