目录
1 数据类型
char | 字符数据类型 |
short | 短整型 |
int | 整形 |
long | 长整型 |
long long | 更长的整形 |
float | 单精度浮点数 |
double | 双精度浮点数 |
1.1数据类型分类
整形家族:
char | short | int | long |
unsigned char | unsigned short | unsigned int | unsigned long |
signed char | signed short | signed int | signed long |
注意:在任意的编译器中short、int、long类型如果没有特殊的注明,都是无符号的,即是signed。唯独char类型比较特殊,如果没有特殊的注明,是不清楚是否为有符号还是无符号的。
浮点数家族:
float | double |
构造类型:
数组类型 |
结构体类型struct |
枚举类型enum |
联合类型union |
指针类型:
int* pi |
char* pc |
float* pf |
void* pv |
注意:void* 类型一般是用来临时存放地址的,如果想对其进行修改,编译器就会报错。例如想实现pv++;的操作,编译器因不知道要跳过具体的字节数,所以就无法实现想要的功能。
空类型:
void表示空类型(无类型)
一般用于函数的返回类型、函数的参数、指针类型。
2 整形在内存中的存储
一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。
2.1 原码、反码、补码
计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
正数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码 直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码 将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码 反码+1就得到补码。
对于整形来说:数据存放内存中其实存放的是补码。
为什么计算机内存中是用补码进行存放的呢?
小编用一个例子来解释这个问题
int main()
{
int a = 1;
int b = -1;
printf("%d", a + b);
return 0;
}
int main()
{
int a = 1;
int b = -1;
a是正数,原码反码补码相同
//00000000000000000000000000000001
//b是负数,原码反码补码需要相互转化
//10000000000000000000000000000001--原码
//11111111111111111111111111111110--反码
//11111111111111111111111111111111--补码
//假设正数负数都使用原码计算
//00000000000000000000000000000001 --a的原码
//10000000000000000000000000000001 --b的原码
//10000000000000000000000000000010 相加后的结果--> -2
//根据我们的常识1+(-1)的结果是0,但依照上述方法计算出来的结果却是-2
//11111111111111111111111111111111 --b的补码
//00000000000000000000000000000001 --a的补码
//00000000000000000000000000000000 --相加后的结果为0
return 0;
}
上面的这个例子很好的展示了在内存中,是用整形的补码进行运算,如果直接使用原码,就会得出错误的结果。
3 大、小端介绍
3.1 什么大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。
3.2 为什么会有大小端
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short 型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因 此就导致了大端存储模式和小端存储模式。
3.3 如何判断大小端
int check_sys()
{
int a = 1;//十六进制为0x00000001
if (*(char*)&a == 1)//根据大小端的定义,只要取出内存中的第一个字节进行比较就可以进行判断
return 1;
else
return 0;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
搭配下图,可以更好的理解: