代码编织梦想

目录:

一、数据类型介绍

1.基本内置类型

2.构造类型

3.指针类型

4.空类型

二、整型在内存中的存储

1.原码,反码,补码

2.大小端介绍

3.有符号和无符号

三、浮点型在内存中的存储

1.定义

2.浮点数的存储规则

3.对于S,M,E的详细理解

下面进入正文:

一、数据类型介绍

1.基本内置类型

      基本内置类型包含整型和浮点型,整型包含short、long、int、long long、char等等,而浮点型则包含float、double、long double等等,它们所占用的字节也各不相同:char-1字节,shor-2字节、int-4字节、long-4/8字节、float-4字节,double-8字节等等。

tips:

①:而为什么char输入整型,原因是:字符存储的时候,存储的是ASCII码值,是整型,所以归类的时候放在整型。

②:如果我们这里想计算整型或浮点型所能代表的范围,可以使用一个函数:INT_MAX,这里需要引用头文件#include<limits.h>.

 2.构造类型

     构造类型又称为自定义类型,数据类型,结构体类型(struct),枚举类型(enum),联合类型(union)都输入其中。

3.指针类型

 

4.空类型

    void表示空类型(无类型)

   通常应用于函数的返回类型,函数的参数,指针类型(void *p)等.

二、整型在内存中的存储

1.原码,反码,补码

    整型数据的二进制表示形式有三种:原码、反码和补码;这三种表示均有符号位和数值位两部分,符号位用0表示正,1表示负,而数值位则根据本身的数计算得到。

   ①正数:正数的原码,反码和补码都相同。

   ②负数:负数的原码,反码和补码各不相同

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

     反码:原码的符号位不变,其他位依次按位取反(0变成1,1变成0)得到反码。

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

对于所有整型来说:数据存放在内存中的其实存放的是补码。

例题:

 

2.大小端介绍

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。

 小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

图片如下:

 如图,在地址中存储的16进制码为0x 11 22 33 44

小端存储模式:44为低位,所以保存在低地址中;11为高位,所以保存在内存的高地址中。

高端存储模式:44为低位,所以保存在高地址中;11为高位,所以保存在内存的低地址中。

字节序:是以字节为单位,讨论存储顺序的。

下面我们就可以设计一个小程序来判断当前机器的字节序

int bigorsmall()
{
	int i = 1;
	return (*(char*)&i);
}
int main()
{
	int ret = bigorsmall();
	if (ret == 1)
	{
		printf("小端模式\n");
	}
	else
	{
		printf("大端模式\n");
	}
	return 0;
}

3.有符号和无符号

    对于整型家族的类型来说,有:有符号和无符号的区分。

    比如:

   short==signed short   ;unsigned short

   一般short,long,int,long long都表达的是有符号的。

    char是signed char还是unsigned char不确定

    char在VS上—>signed char

     这里对char进行有符号和无符号的讨论:

 %d----十进制的形式打印有符号的整型整数。

 %u----十进制的形式打印无符号的整型整数。

  tips:

            1.原码和补码相互转化的三种方式

           ①原码按位取反+1=补码

           ②(补码-1)按位取反=原码

           ③补码按位取反+1=原码

           2. strlen是求字符串长度的,统计的是\0之前出现的字符的个数

              \0的ASCII码值是0;

三、浮点型在内存中的存储

1.定义

  首先,我们要理解浮点数的意思:数学中的小学,小数点可以移动的数字叫作浮点数。

  想要知道浮点数所表示的范围,也可以使用函数INT_MAX,但是头文件不一样,要引用#include<float.h>.

   注意:整型和浮点型在内存中的存储方式是有差异的!

2.浮点数的存储规则

任意一个二进制浮点数v可以表示成下面的形式:

(-1)^S * M * 2^E

(-1)^S表示符号位,当S=0V为正数;当S=1V为负数。

M表示有效数字,大于等于1,小于2

2^E 表示指数位。
这里我们可以举一个例子来进行理解

 而对于32位的float和64位的double,他们存储位数不一样:

 对于 32 位的浮点数,最高的 1 位是符号位 S ,接着的 8 位是指数 E ,剩下的 23 位为有效数字 M

 

 对于 64 位的浮点数,最高的 1 位是符号位S,接着的 11 位是指数 E ,剩下的 52 位为有效数字 M

 

3.对于S,M,E的详细理解

①M:  因为M中默认第一位总是1,所以只保留小数部分。

      比如:1.01,只保存0.1,等到读取的时候,再把第一位的1加上去。

②E:  存入内存时E的真实值必须再加上一个中间数

     32位中8位E:中间数是127.

     64位中11位E:中间数是1023.

 ③指数E从内存中取出还可以再分成三种情况

E 不全为 0 或不全为1
这时,浮点数就采用下面的规则表示,即指数 E 的计算值减去 127 (或 1023 ),得到真实值,再将
有效数字 M 前加上第一位的 1
比如:
0.5 1/2 )的二进制形式为 0.1 ,由于规定正数部分必须为 1 ,即将小数点右移 1 位,则为
1.0*2^(-1) ,其阶码为 -1+127=126 ,表示为
01111110 ,而尾数 1.0 去掉整数部分为 0 ,补齐 0 23 00000000000000000000000 ,则其二进
制表示形式为: 0 01111110 00000000000000000000000
E 全为 0
这时,浮点数的指数 E 等于 1-127 (或者 1-1023 )即为真实值,
有效数字 M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于
0 的很小的数字.
E 全为 1
这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s )。
以上就是关于数据在内存中的存储的讲解!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xpcxpt/article/details/131027476