C language data types and their storage methods

1. Introduction to data types

        1. Common data types

        2. Plastic surgery family

        3. Floating point family

        4. Construction type

        5. Pointer type

        6. Empty type

2. Storage of integers in memory

        1. Original code, inverse code and complement code

        2. Introduction to big and small endian byte order

3. Storage of floating point numbers in memory

        1. Storage rules for floating point numbers

        2. Special provisions for the number M and the exponent E

4. Summary

1. Introduction to data types

        1. Common data types

type of data name Byte size
char character data type 1
short Short 2
int integer 4
long Long plastic surgery 4/8
long long long integer 8
float Single precision floating point 4
doulb

Double precision floating point

8

        2. Integrated family

                        Integers are divided into signed integers and unsigned integers:

type of data signed integer unsigned integer
char signed char unsigned char
short signed short [ int ] unsigned short [ int ]
int signed int unsigned int

long

signed long [ int ]

unsigned long [ int ]

long long signed long long [ int ] unsigned long long [ int ]
In fact, for the char type, although it is a character type, what is stored in the memory is its corresponding ASCll value, and ASCll is a number, so the char type is also a member of the integer family.

                Our normal type declarations default to signed integers, so signed is omitted.

        3. Floating point family

type of data
float
double
long double---------Introduced in the new grammar rules, just understand it

        4.Construction type

                      Constructed types are also called "custom types":

array type int [ ] ,char [ ] 等
Structure type struct
enumeration type enum
union type union

         5.Pointer type

integer pointer int *pi
character pointer char *pc
single precision floating point pointer float *pf
null pointer void *pv
pointer to structure struct stuendt *p etc.

除此之外还有:二级指针,三级指针,数组指针,函数指针等

         6.空类型

void 表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针类型
比如 :void* p ,void test test ( )......

二,整型在内存中的存储

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

        接下来我们谈谈数据在所开辟内存中到底是如何存储的?

比如:

int a = 10 ;

int b = -10 ;

         我们列了两个整型变量来观察,根据类型的不同,变量会向系统申请不同内存大小的空间

        上述,变量向系统申请了4个字节的空间用来存储,那究竟是如何存储的呢?我们且来分析一下:

        先观察变量 a 在内存中的存储:

 解释:显而易见地址的右边是变量a的地址,红色字体是变量a在内存中的储存的内容

           每两个数为一个字节,共四个字节

            地址空间所存储的值是以16进制的形式进行存储的

再来观察一下变量b在内存中的存储:

 解释:显而易见,红色字体是变量b在内存中的储存的内容

            肯定大家都发现了此内容超级大并且顺序颠倒!这是为什么呢?        

            欲知后事如何,且听下回分解!

1.原码,反码和补码

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

三种表示方法均有符号位数值位两部分,符号位都是用0来表示 " 正 ",用1来表示 " 负 "

正数的原,反,补码都相同

负整数的三种表示方法格不相同

原码:
直接将数值按照正负数的形式翻译成二进制就可以得到原码
反码:
将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:
反码+1就可以得到补码

 对于整型来说:数据存放在内存中的是补码--------这也是为什么上述变量 " b " 存放在内存   中   如此巨大的原因!

 2,大小端字节序介绍

大端:

大端字节序(存储)模式,是指数据的地位字节处的内容保存在内存的高地址中,而数据的高位字节处的内容,保存在内存的低地址中
小端:
小端字节序(存储)模式,是指数据的地位字节处的内容保存在内存的低地址中,而数据的高位字节处的内容,保存在内存的高地址中

 由此我们来分析变量 " a " 和 " b " 的情况--------

变量 二进制补码 十六进制
a = 10 00000000 00000000 00000000 00001010 00 00 00 0a
b = -10 11111111 11111111 11111111 11110110 ff ff ff fa

进制数:

                  左边为高位,右边为地位

在内存中:

                  左边为低地址,右边为高地址

        我们使用的环境一般情况下默认为小端存储模式,所以存在内存才会出现倒着存的现象!

三,浮点数在内存中的存储

我们常见的浮点数有:3.14159  ,  1E10 等

 1,浮点数的存储规则

        根据国际标准IEEE (电气和电子工程协会)754,任意一个二进制浮点数V可以写成下面的形式:

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

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

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

  2 ^ E 表示指数位

举个例子:

                 十进制的5.0,写成二进制是101.0,相当于1.01*2^2

                  那么,按照上面的格式,可得出S=0,M=1.01,E=2

                 十进制的-5.0,写成二进制是-101.0,相当于-1.01*2^2。那么,S=1,M=1.01,E=2。

   我们以单精度浮点型32位数据为例:

 而双精度浮点型64数据为例:

 2,数字M和指数E的特殊规定

      IEEE754对有效数字M和指数E,还有一些特别规定 :

       对于M:

前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。

以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。等于说可以多出一位来保存数据。

       

对于E,情况更为复杂; 

         首先,E为一个无符号整数(unsigned int)这意味着,如果E为8位,它的取值范围为0-255。如果E为11位,它的取值范围为0~2047。

         但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

然后,指数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 0000000 00000000 00000000

 第二种:E全为0

        这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

第三种:E全为1 

这时,如果有效数字M全为0(虽然M全为0,但是我们省略了小数点前的1),表示±无穷大(正负取决于符号位s);

好了,关于浮点数的规则,就到这里了! 

以下我们来举个例子观察一下:

 变量 n 为9.5,二进制为1001.1=(-1)^0 *1.0011 * 2^3

 S=0,E=3,M=1.0011

 有效 E = 3+127

 二进制保存为:0 10000010 0011000 00000000 00000000

 转为十六进制为:41 18 00 00

 小端字节序存储:00 00 18 41

 是不是就对上了√

 四,总结

      本文呢,主要详解了数据类型及其在内存中的存储方式,同时呢解刨了,原码,反码和补码的概念;

        数据在内存中的存储方式---大小端字节序(存储);

        以及浮点型的存储方式,让我们以后做题目时能更加从容,不会惊慌失措;

        深度理解各种数据在内存中的存储方式;

        咱们一起努力!

        未来可期! 

Guess you like

Origin blog.csdn.net/m0_71676870/article/details/130984595