一、为什么需要数据类型
- 数据在存放的时候,需要开辟内存空间,不同数据根据他所需要开辟的内存空间大小不一样,所以我们需要根据数据的大小,来选择合适的数据类型去存放数据,以达到节约内存空间,提高代码的效率。
二、如何查看数据大小
- 在C语言中,使用 sizeof 运算符来查看所选的数据类型大小。
#include<stdio.h>
void main()
{
printf("char_size =%d \n" , sizeof(char));
printf("short_size =%d \n" , sizeof(short));
printf("int_size =%d \n" , sizeof(int));
printf("long_size =%d \n" , sizeof(long));
printf("float_size = %d \n" , sizeof(float));
printf("double_size = %d \n" , sizeof(double));
printf("long long_size = %d \n" , sizeof(long long));
printf("long double_size = %d \n" , sizeof(long double));
}
- 可以查看到如下结果:
可以看见linux c在32位机中:
- char 占1个字节
- short 占2个字节
- int 占4个字节
- long 占4个字节
- float 占4个字节
- double 占8个字节
- long long 占8个字节
- long double 占12个字节
三、如何计算数据类型的数值范围
- 首先要明白数据大小的转换方式:
- 1 Byte(字节) = 8 bit (8位 二进制)
- 先分是无符号类型还是有符号(默认为有符号)
- 再看所用类型占用内存几个字节,转换成对应位数(多少位二进制),然后对应数据对应的最大值则为(无符号)2的对应位数次方-1 或者 (有符号)2的对应位数次方除以2再-1.
例如:
char 类型:
- 有符号:首先,char 类型占1个字节也就是8位 ,则 2^8 = 256,又因为是有符号的类型,所以要对半分,即正负数各占一半,所以char类型的最大数据大小为 2^8 除以2 -1(即256/2-1 = 127)
- 无符号:首先,unsigned char类型占1个字节也就是8位 , 着2^8 =256,又因为是无符号的类型,所以最小为0,最大数据大小为2^8-1(即255)
四、如何计算数据溢出后的数值
- 首先要明白数据的正负数再内存中的存储方式:
- 正数在内存中以原码的形式存储
- 负数在内存中以补码的形式存储
- 给出输入数值,求溢出后的显示的数值
例如:
- 若char a = 310, 求溢出后显示的数值
首先将 310 转化为二进制数 --> 1 0011 0110
又因为一个地址空间最大存放为八位 所以数据的最高位1溢出了 即
10011 0110得到的0011 0110 为54(十进制)
所以溢出后显示的数值为54
- 若 char a = 210,求溢出后显示的数值
首先要知道一个地址空间,最大存放8位数据,并且 char 类型占一个字节,也就是8位
首先将 210 转化为二进制数 --> 1101 0010
因为默认为有符号类型,最高位为符号位,符号位为1,则表示为负数,负数在内存空间以补码形式存储。所以要求其补码
1101 0010 (原码) --> 1010 1101 (取反后得到反码) -->1010 1110 (反码+1,得到补码) , 于此同时,1010 1110为-46(十进制),所以溢出后,将a打印出来的数值为-46
- 同理,也可以通过溢出后显示的数据,来算出输入的数值可以为多少
五、数据的大端序与小端序
- 小端序:内存空间中,低位地址,存放数据的低有效位。
- 大端序:内存空间中,低位地址,存放数据的高有效位。
大小端序主要影响的是不同计算机间的数据传输,同一台电脑内的数据传输没有影响