内存数据存储方式,基本数据类型在内存中如何存储
前言:大家好。今天,我们将解释数据是如何存储在内存中的。本章分为两部分。第一部分是给大家介绍原码、逆码、补码的概念。第二部分是如何判断内存中是否存在有符号数的取值范围。期间会插入两个经典问题和你一起回答。我们开始吧。
正文的第一部分源代码==源代码实际上是把整数转换成二进制的形式==
比如我们的int a=10,那么我的原代码就是
000 0000 0000 0000 0000 0000 0000 0000 0000 1010-原始代码
当我们的int a=-10时,那么我们的原始代码是
100 0000 0000 0000 0000 0000 0000 1010-原始代码
你可以看到不同之处。这两个数的第一个二进制是0和1。那是因为,在有符号二进制中,第一个二进制数中0为正,1为负,所以你可以看到-10的第一位是1。
二进制转换是这样进行的:
详情见《明解C语言入门篇》。
码int a=10的倒数为
000 0000 0000 0000 0000 0000 0000 0000 1010-相反的代码
当int a=-10时,他的逆代码是
111 111 111 1111 1111 1111 1111 1111 1111 0101-逆代码
在二进制中,正整数的原码、反码和补码都是一样的,所以上面int a=10的反码和原码是一样的。反码是指符号位不变,其他位逐位反转。
补码int a=10补码
000 0000 0000 0000 0000 0000 0000 1010-补充
int a=-10的补码
111 111 111 1111 1111 1111 1111 1111 1111 0110-补充
可以认为补码是在反码的基础上做的补丁,经过修正,所以叫“补码”。
原码、逆码、补码的概念只对负数有实际意义。对于正数,原码、逆码、补码都是一样的。
所以我们可以理解为:
下面做一道题。
这个问题,你可能会说,太简单了,没有技术含量。别担心,让我们向您展示二进制是如何在编译器中计算的:
这就是我们的计算机执行二进制算法的过程,所有的算法都变成了补码,这样它只需要加法,除了加法之外没有任何运算。
由于整数在内存中是用补码表示的,所以计算机不需要区分符号位和数值位,通过设计一个简单的加法电路就可以同时实现加法和减法,效率非常高,大大简化了计算机的硬件电路。
第二部分是如何判断内存中是否有符号数的取值范围。
我先给你介绍两种英语。
无符号(无符号数)
有符号(有符号的数字)
我们以int为例,
无符号整数
有符号整数
(同Internationalorganizations)国际组织
这三种类型中
有符号int和int的类型是一样的,都是有符号数,所以我们可以认为有符号可以省略。
我给你看一个问题,你可以思考一下。
!
好了,看完这个问题的答案会是什么?-128,128,或者别的,那我带你去答。
下面是char类型的原码,补码,补码。
接下来,我们可以计算他的原始代码的值变成了一个十进制数,
让我们来看看电脑的操作。
一模一样,那么你可能会问,什么是整容,给你解释一下:
这可能意味着
如果我是一个char数,我想打印%d或者%u,因为%d和%u都是塑料,所以我需要把我的8位二进制数提升到32位,这样我就可以给你画图了。
你可以看到蓝框中的那个,那个数字就是我们想要重塑和升级的符号位。因为我们的第一个符号位是0,后面直接用0到32位填充。
另外,给大家看看符号位是1,二进制数是如何整形改进的。
两张图都是通过带符号的数字来塑造和提升的。接下来,让我们向您展示如何塑造和改善无符号数。
这是塑料促销,但你可能会问,嗯?为什么你上一个问题的塑料升级明明是%u为什么不补充0和1?让我给你解释一下。因为我们打印%u但是我们的char类型是有符号数,所以我们的plastic upgrade是基于类型的,也就是说,如果我们是无符号char,那么我们的plastic upgrade就意味着所有其他位都用0来补充。
最后一个是这个,但是在我们上面的问题中,它的char类型是有符号数,所以塑形提升是按照最左边的第一个数来判断的。如果是1,则加1,如果是0,则加0,直到填满32位。
好了,本文是数据记忆的初级阶段。以后高级阶段会按照时间来写,很多经典问题都会在高级阶段讲解。感谢观看!
,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。