番外–>数据在计算机的存储

类型,不光出现在定义变量的时候,还有使用变量的时候。

  1. 类型决定了开辟空间的大小

存的角度,定义变量时使用何种类型就代表分配给变量多大的内存空间,这个变量最大能拥有多少空间。

如:int a就分配给了a变量4个字节的空间,char就是1个字节。

  1. 看待内存空间的方式

取的角度,以什么样的方式去看待空间里的数据,(这边说是取,其实有点牵强,最多说是看)

int a;unsigned int b;float c;,编译器认为a是有符号整型,b是无符号整型,c是浮点型

int a = 10;
float b = 10.0f;

ab都是4个字节,为何还要分你是int我是float呢?因为看待这4个字节的视角不一样,编译器认为a里存放的整型数据,而b是浮点型变量。

创建变量的实质是在内存上为其开辟一块空间,空间大小由变量类型决定。那么数据在内存中到底是如何存储的呢?

一、整型:

我们直接看程序吧:

#include <iostream>

using namespace std;


int main()
{

    int a = 0x12345678;//十六进制数
    printf("%dn",&a);

    char *p;
    p = (char *)&a;

for(int i = 0;i < 4;i++){

    printf("%dn",p + i);//输出每个字节的地址
    printf("%xnn",*(p + i));

    }

    return 0;

}

结果是:

番外-->数据在计算机的存储

按照一般的想法,应该是12345678才对啊,怎么按照地址顺序成了78563412了呢?这就涉及到整型数据在计算机的存储。分为小端序和大端序。

在32位系统中,一个int为四个字节,32位二进制,数据在内存中补码的形式存储

==》正数的补码是本身

==》负数的补码等于它取反加1

我使用的Dev-C++是一个小端机,内存显示是从低地址开始读的,说到小端机,一定会有人问是不是还有大端机?

下面我们一起来看看大小端的区别:

大端机:数据低地址存放高字节,高地址存放低字节 例:C51单片机

小端机:数据低地址存放低字节,高地址存放高字节 例:X86

一个整型的占4个字节 它的地址是用最低位来表示。

!!几句代码查看什么端:

int a = 0x12345678;

short p = (short)&a;

printf("%#xn", *p);//小端打印为0x5678,虽然存是低地址存低字节,但取不一样。所以是0x5678

一个地址占8位,16进制转换为2进制占2个。所以78在一起,56在一起。

二、浮点型

还是直接上例子:

#include <iostream>

using namespace std;

int main()
{
    float a = 178.125;

    float *p = &a;  

    char *q = (char*)&a;

    for(int i = 0;i < 4;i ++){

        printf("地址:%dn",q + i); 
        printf("地址值:%#xn",*(q + i));
    }

    return 0;


}

结果是这样:

番外-->数据在计算机的存储

我们把它转换成二进制看看(小端序):0100 0011 0011 0010 0010 0000 0000 0000,这是一件十分头大的事,看起来就像天书一样。

现在大致说一下:我们始终记得,计算机只认识二进制,在计算机中,不管是什么类型的数据。最终只会变成二进制,不同的数据类型可能存的值一样,只是取得方式不一样。而浮点数在计算机是这样存储的:符 号 位 占 10 ( 31 位 ) 码 占 8 位 ( 23 位 一 300 ) 臼 oat : 共 32b i t 数 占 23 位 ( 剩 余 的 23 位 )

//(double)1位符号位,11位指数位,52位尾数位。//

如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是我们知道,科学计数法中的E是可以出现负数的,所以,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127

将十进制178.125表示成机器内的32位的二进制形式-->

1:将178.125表示成二进制数:

(178.125)(十进制数) = (10110010.001)(二进制形式);

2:将二进制形式的浮点实数转化为规格化的形式:

10110010.001 = 1.0110010001 * 2 ^ 7 (小数点向左移7二进制位可得)

3:符号位(1位):

该数为正数,故第31位为0,占一个二进制位.

4:阶码(8位):

指数为7,故其阶码为127 + 7 = 134 = (10000110)(二进制),占从第30到第23共8个二进制位.

5:尾数(32 - 8 - 1 = 23位):

为小数点后的部分, 即0110010001.因为尾数共23个二进制位,在后面补13个0,即01100100010000000000000

6:178.125在内存中的实际表示方式为:

0 10000110 01100100010000000000000,这是不是我们在程序中看到的场景呢!

原文链接: https://www.cnblogs.com/hbnb/p/15783996.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/184655

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午10:46
下一篇 2023年2月12日 上午10:46

相关推荐