文章目录
一、数据类型
1.基本数据类型
char | 字符数据类型 |
---|---|
short | 短整型 |
int | 整型 |
long | 长整型 |
long long | 更长整型 |
float | 单精度浮点数 |
double | 双精度浮点数 |
注:C语言中没有专门的字符串类型
2.类型的基本归类
有符号(signed):最高位是0,表示是正数;最高位是1,表示是负数。
无符号(unsigned):最高位也是数据位。
有符号(signed) | 无符号(unsigned) |
---|---|
char(-128~127) | unsigned char (0~255) |
short(signed short) | unsigned short |
int(signed int) | unsigned int |
long(signed long) | unsigned long |
示例:
unsigned int a = -10;
int b = -10;
printf("a = %u\n", a);//%u打印无符号数,意思是打印的一定是无符号数,不是无符号数,也认为是无符号数
printf("b = %u\n", b);
printf("a = %d\n", a);//%d打印有符号数,意思是打印的一定是有符号数,不是有符号数,也认为是有符号数
二、整形在内存中的存储
1.原码、反码、补码
正数的反码和补码都与原码相同;
负数的反码为原码符号位不变其他位取反,补码为反码+1。
正数(10) | 负数(-10) | |
---|---|---|
原码 | 00000000 00000000 00000000 00001010 | 10000000 00000000 00000000 00001010 |
反码 | 00000000 00000000 00000000 00001010 | 11111111 11111111 11111111 11110101 |
补码 | 00000000 00000000 00000000 00001010 | 11111111 11111111 11111111 11110110 |
上表格示例(int):有4个字节=32位,整形在计算机中是以补码的形式进行存储的。
2.大小端字节序存储
(1)小端字节序存储:把一个数据的低位字节处的数据存放在低地址处;把高位字节处于的数据存放在高地址位。
(2)大端字节序存储:把一个数据的高位字节处的数据存放在低地址处;把低位字节处于的数据存放在高地址位。
例:下图是小端存储的。
判断系统大小端(示例):
//判断大小端
int check_sys(char* p) {
if (*p == 1) {
return 1;
}
else {
return 0;
}
}
int main()
{
int c = 1;
char* p = (char*)&c;
int ret = check_sys(p);
if (ret == 1) {
printf("小端\n");
}
else {
printf("大端\n");
}
return 0;
}
三、浮点型在内存中的存储
根据国际标准IEEE,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S:表示符号位,当S=0,V为正数;当S=1,V为负数。
M:表示有效数字,大于等于1,小于2。
2^E:表示指数位
示例:
float f = 5.5;//101.1
// (-1)^0*1.011*2^2
// 101.1
//s=0
//M=1.011
//E=2
四、练习
示例:
int n = 9;
//00000000 00000000 00000000 00001001
float* pFloat = (float*)&n;
//0 00000000 00000000000000000001001浮点型解析
//s=0
//E=1-127=-126
//M=0.00000000000000000001001
//(-1)^0*0.00000000000000000001001*2^(-126) //非常小无限接近0
printf("n=%d\n", n);//9
printf("*pFloat=%f\n", *pFloat);//0
*pFloat = 9.0;//1001.0
//(-1)^0*1.001*2^3
//s=0
//M=1.001
//E=3 +127=130//修正值
//0 10000010 00100000000000000000000 存放的二进制序列
printf("n=%d\n", n);//(01000001000100000000000000000000)= 1091567616
printf("*pFloat=%f\n", pFloat);//9.000000