[C语言]解析整数、浮点数在内存中的存储

前言

我们知道计算机可以识别的就是01二进制位。那么小伙伴们是否有这样的疑惑,就是明明计算机只能识别01二进制位,那么计算机是如何通过二进制位识别和表达各种数据的呢?今天我们就这一问题解析整数、浮点数在计算机内存中的存储。

一、整数在内存中的存储

我们知道一个变量的创建是要在内存开辟空间的。空间的大小是根据不同的类型而决定的。

比如:

int a=20;
int b=-10;

我们知道为a分配4个字节的空间。那如何存储?接下来了解以下概念:

1.1、原码、反码、补码

计算机中的整数有三种表示方法,即原码、反码和补码。

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“+”,用1表示“-”,而数值为负整数的三中表示方法各不相同。

原码:直接将二进制按照正负数的形式翻译成二进制就可以。

反码:将原码的符号位不变,其他位依次按位取反就可以得到。

补码:反码+1得到补码。

其中对于正整数,它的原码、反码、补码都相同。

对于负数,则需要根据上面的转换关系得到。

对于整形来说:数据存放内存中其实存放的是补码。为什么呢?在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理。同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码和原码的相互转换,其运算过程是相同的,不需要额外的硬件电路。

接下来,让我们看看实际例子:

#include<stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d b=%d c=%d\n", a, b, c);
	return 0;
}

让我们看看这段代码的运行结果是什么

 答案是:a-1,b=-1,c=255

为什么呢?接下来我带大家仔细分析一下。

  • 首先,我们要先计算出-1的补码,因为计算机内存中存储的都是数值的补码,具体计算过程如图:

      

       我们先根据-1的数值写出对应的原码,然后原码符号位不变,其他位按位取反得到反码,最后反码+1得到补码。

  • 然后我们将-1存入char类型的a中,因为-1为整数有32个二进制位,要把它存入char 类型的a中要发生截断,只存取最低8个比特位的数据,如图:

  •  同理,我们对b、c也进行这一操作,得到:

  •  最后就是打印这一过程,我们知道%d是以十进制的形式打印有符号的整型。但是,我们目前的三个数都是char类型的,所以在这个过程中就肯定会发生整型提升。关于整型提升以及整型提升的规则,我们今天不做讲解,不是我们今天要讲的重点,所以涉及到整型提升的地方我就直接给出结果

 然后再这里我们得到是数值的补码,我们还需要经过计算得到它的原码,相信经过上面的学习大家都会了,所以这里的补码如何得到原码就交给大家自己计算啦

#include<stdio.h>
int main()
{
	char a = -1;
	//1000 0000 0000 0000 0000 0000 0000 0001 -- (-1)的原码
	//1111 1111 1111 1111 1111 1111 1111 1110 -- (-1)的反码
	//1111 1111 1111 1111 1111 1111 1111 1111 -- (-1)的补码
	//1111 1111 -- a
	signed char b = -1;
	//1000 0000 0000 0000 0000 0000 0000 0001 -- (-1)的原码
	//1111 1111 1111 1111 1111 1111 1111 1110 -- (-1)的反码
	//1111 1111 1111 1111 1111 1111 1111 1111 -- (-1)的补码
	//1111 1111 -- b
	unsigned char c = -1;
	//1000 0000 0000 0000 0000 0000 0000 0001 -- (-1)的原码
	//1111 1111 1111 1111 1111 1111 1111 1110 -- (-1)的反码
	//1111 1111 1111 1111 1111 1111 1111 1111 -- (-1)的补码
	//1111 1111 -- c
	printf("a=%d b=%d c=%d\n", a, b, c);
	//1111 1111 1111 1111 1111 1111 1111 1111 -- a整型提升后
	//1111 1111 1111 1111 1111 1111 1111 1111 -- b整型提升后
	//0000 0000 0000 0000 0000 0000 1111 1111 -- c整型提升后
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

自然语言编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值