目录
一、数据类型介绍
1)类型的基本归类
整型:
char (unsigned char singned char)
short (unsigned short singned short)
int (unsigned int signed int)
long (unsigned long signed long)
char虽是字符类型,但是字符类型存储的存储的是Ascii码值,是整数。
short,int,long默认为有符号的,也就是signed xxx;但char默认是否有符号未被定义,将取决于编译器。
浮点型:
float
double
构造类型:
数组类型(比如说int arr[10];,arr的类型是int [10])
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型:
int* pi;
char* pc;
void* pv;
空类型:
void,通常用于函数的返回类型,函数的参数,指针类型。
二、整型在内存中的存储
1)原码、反码、补码
计算机中整数有三种表示方法,及原码、反码、补码。数据在内存中存的是补码。
由符号位和数值位两部分组成,其中第一位为符号位,0表示正数,1表示负数。
正数的原码、反码、补码都相同。
eg:5
原码、反码、补码都为:
00000000 00000000 00000000 00000101(第一个0为符号位表示正)
负数的反码、补码需计算得来。
反码:原码符号位不变,其他位依次按位取反。
补码:反码+1。
eg:-5
原码:10000000 00000000 00000000 00000101(第一个1为符号位表示负)
反码:11111111 11111111 11111111 11111010(第一位不变,其他按位取反)
补码:11111111 11111111 11111111 11111011(反码+1)
补码转变回原码有两种方式:
1.补码-1后,符号位不变,其他位依次按位取反。
2.补码符号位不变,其他位按位取反后,再+1。
当你定义的是无符号的变量,将没有符号位,全部为数值位。无符号变量用%u打印。
使用%u不管你是否为无符号的变量,将全部视为无符号变量打印。
eg:unsigned int j = -5;
-5的补码:11111111 11111111 11111111 11111011
如果用%u打印,第一位不再是符号位,将视为正数,原码与补码相同,打印出来的是一个很大的数,不将是-5。
2)大小端介绍
大端存储模式,是指数据的低位保存在内存高的地址中,而数据的高位保存在内存低的地址中。
小端存储模式,是指数据的低位保存在内存低的地址中,而数据的高位保存在内存高的地址中。
eg:int a = 0x11223344;
11是低位,44是高位,下图分别是大小端不同的存储模式。
设计一个程序来判断该编译器的字节序
#include <stdio.h>
int check_sys()
{
int i = 1;
//int是四个字节,1化为十六进制为00 00 00 01
//如果只访问一个字节为01,就是小端存储;反之就是大端存储
return (*(char *)&i);
//需要从整型的四个字节中,拿出第一个字节。char*的指针解引用访问一个字节
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
三、浮点型在内存中的存储
1)浮点数存储规则
根据国际标准IEEE(电器和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
- (-1)^S * M * 2^E
- (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
- M表示有效数字,大于等于1,小于2。
- 2^E表示指数位。
eg:-5.0
写成二进制是-101.0,相当于-1.01 * 2^2,那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
IEEE 754对于有效数字M和是指数E,还有一些特别的规定。
M总被表示为1.xxxxx的形式,其xxxxx表示小数位。IEEE 754规定,在计算机内部保存M时,默认第一位总是1,因此可被舍去,只保留后面的xxxxx部分。这样做的目的,是节省1位有效数字。
eg:保存1.01
只保存01,读取时,再把第一位加上去。
至于指数E,情况就比较复杂。
首先,E为一个无符号整数(unsigned int)
然后,指数E从内存中取出还可以再分成三种情况:
E不全为0或不全为1
这时,浮点数的指数E的计算值减去127(或1023),得到真实值,再将 有效数字M前加上第一位的1。
E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值 。有效数字M不再加上第一位的1,而是还原为0.xxxxx的小数。这样做是为了表示±0,以及接近于0很小的数字。
E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位S)。
以上就是介数据存储的有关内容了,希望对大家有所帮助吖!