数据类型介绍
1.类型的基本归类:
整形家族:
1)char:包括 unsigned char(无符号字符), signed char(有符号)
2)int:包括 unsigned int(无符号), signde int (有符号)
3)short :包括 unsigned short [int] ,signed short [int]
4)long:包括 unsigned long [int] ,signed long [int]
浮点数家族:
float ,double
构造类型:
数组类型
结构体类型 struct
枚举类型 enum
联合体类型 union
指针类型: int* ,char*, float* ,void*
空类型 void 通常运用于函数的返回类型,函数的参数,指针类型。
整形在内存中的存储
结论:整形数据的存放都为补码。
原码,反码,补码的介绍
计算的符号表示有三种方式,即原码,反码,补码方式,三种表示法均有符号位和数值位,符号位(最高位置bit)用0表示正数,用1表示负数
1.对于正数来说:原码等于反码等于补码,即直接将数值翻译为二进制形式写出即可
2.对于负数来说:
原码:同正数,直接将数值翻译为二进制形式写出即可
反码:原码符号位不变,其他位按位取反
补码:反码+1即得到补码
例:b = -10;
原码: 10000000 00000000 00000000 00001010
反码: 11111111 11111111 11111111 11110101
补码: 11111111 11111111 11111111 11110110
a = 10;
原码=反码=补码:00000000 00000000 00000000 00001010
整形的两种存储方法
前提:因为int short等整形内存空间大于1字节,因此存在多个字节的安排问题。
大端存储模式:将数据的低位存储在内存高地址中,数据高位存储在内存低地址中。
图示:以存储0x11223344为例
小端存储模式:将数据的低位存储在内存低地址中,数据高位存储在内存高地址中。
图示:以0x11223344为例
一道例题:
题目:设计一个小程序来判断当前电脑的字节序
思路:只需要以1的存储为例,取出1内存的首字节地址,如果为01,则为小端存储,如果为00,则为大端存储。
要点:用char类型截断取出首字节地址。
代码实现:
#include<stdio.h>
int main( )
{
int n = 1;
char* a = (char*)&n;
if(a == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
浮点数在内存中的存储
浮点数在计算机内部的存储方式
根据国际标准IEEE754,任意一个二进制浮点数可以表示为以下方式:
(-1) ^ S * M * 2 ^ E
S表示符号位,0为正数,1为负数
M表示有效数字,大于等于1,小于2
E表示指数位
例:十进制数字5.5在计算机内部的存储方式:
二进制:101.1(2) 也可表示为:1.011 * 2^2
S = 0, M = 1.011,E = 2
IEEE754规定:对于32bit的浮点数,最高一位为符号位S,接下来的8位为指数位E,接下来的23位为有效数字M。
图示:
对于64位浮点数,最高的一位为符号位,接着的11位为指数位,剩下的52位为有效数字位
图示:
IEEE 754对有效数字M和指数E,还有一些特别规定。
对于有效数字M
前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形
式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位舍去后,等于可以保存24位。
对于指数E
1.E为一个无符号整数,则E不可为负数,当E为8位时,取值范围为0 ~ 255,当E为11位时,取值范围为0 ~ 2047,但是事实上E有负数的情况,所以规定,存入E的值时,必须在真实值上加入一个中间值。在32位时中间值为127,64位时中间值为1023。例如在存入32位的2时,实际存入的是2+127=129。也就是10000010
2.E从内存中取出时分为3种情况
1)E不全为0或者不全为1时。
指数E减去127(1024),再将M之前添加1.例如,对于5.5的32位存储,S=0,E=2,M=1.011
则E为2+127 = 129 即1000 0010,M减一得到01100000000000000000000
0 10000010 01100000000000000000000
2)E为全0时,E为-126(-1023),M不再加上1,就写为0.XXXXXX的小数,表示一个十分接近0的数
3)E为全1时,这时,如果M全为1,则表示一个无限±无穷大的数