目录
数据类型详细介绍
整形在内存中的存储:原码,反码,补码
大小端字节序介绍及判断
浮点型在内存中的存储解析
数据类型详细介绍
整形:
1.为什么char类型也会归类到整形家族当中去呢?
字符存储和表示的时候本质上使用的是ASCII值,ASCII值是整数,字符也归类到整形。
2.为什么会存在无符号数和有符号数呢?
因为现实生活中描述一些变量时,存在一些数有正负,而一些数只有正数没有负数,例如年龄 温度
3.我们在使用int类型时,int就相当于signed int,只不过signed可以省略掉
而无符号整数只能写为 unsigned int
4.注意 char是否等价于singed char 取决于编译器,而大部分编译器char 都等价于singed char
构造类型:(自定义类型)
数组类型
结构体类型struct
枚举类型 enum
联合类型union
指针类型:
int* pa;
char* pb;
float* pc;
void* pd;
空类型:
void表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针的类型
void test()//函数不需要返回值
{
}
void test(void)//函数不需要参数
{
}
void* p;//无具体类型的指针
2.整形在内存中的存储:原码,反码,补码
变量的创建是要在内存中开辟空间的,空间大小是根据不同的类型来决定的。
1.计算机中整数有3种二进制表示方法,即原码、反码、补码
2.三种表示方法均有符号位和数值位两部分,0表示正,1表示负
3.正数的原码、反码、补码都相同
负数原码:直接翻译成二进制就可以得到原码
负数反码:除符号位每一位按位取反得到反码
负数补码:反码基础上加1得到补码
4.整形在内存中是以补码的形式存储
int main()
{
int a = 20;
//00000000000000000000000000010100 原码 反码 补码
int b = -10;
//10000000000000000000000000001010 原码
//11111111111111111111111111110101 反码
//11111111111111111111111111110110 补码
return 0;
}
为什么在计算机系统中数值一律用补码的形式进行存储呢?
原因是:使用补码,可以将符号位和数值域统一处理;同时加减法也可以统一处理, CPU只有加法器。
此外,原码和补码进行转换,其运算过程是相同的,不需要额外的硬件电路。
//1-1
//1+(-1)
//00000000000000000000000000000001
//10000000000000000000000000000001
//11111111111111111111111111111110
//100000000000000000000000000000000 1和-1的补码相加
//00000000000000000000000000000000 舍弃最高位
3.大小端字节序介绍及判断
为什么会出现这种倒放的现象呢?
因为任何数据在存储的过程中,如果它的大小大于1个字节,那么它在存储过程中就会存在一个存储顺序的问题。
大端字节序存储:把一个数据的低位字节的数据,存放在高地址处,把高位字节的数据存放在低地址处。
例如存储123:从3的开始依次向高位1存储
小端字节序存储:把一个数据的低位字节的数据,存放在低地址处,把高位字节的数据存放在高地址处。
上图为地址从低到高
知道了大小端字节序,那么我们就可以解决开头的地址倒放现象
所以开始的倒放现象是小端字节序存储的。
设计一个程序,判断数据是大端存储还是小端存储。
思路:假设我们要存储的是整形1,那么在内存中可能就会出现以下两种情况。
int main()
{
int a = 1;//0x00000001
char* p = (char*)&a;//访问1个字节
if (*p == 1)
{
printf("此数据为小端字节序存储\n");
}
else if (*p == 0)
{
printf("此数据为大端字节序存储\n");
}
return 0;
}
封装为函数:
int check_sys()
{
int a = 1;//0x00000001
char* p = (char*)&a;//访问1个字节
if (*p == 1)
return 1;//小端
else
return 0;//大端
}
int main()
{
if (check_sys() == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
有符号char和无符号char的范围
所以推广我们可以得到:
short -2^15~2^15-1
unsigned short 0~ 2^16-1
%d打印有符号数
%u打印无符号数
以上程序为什么会出现这样的结果?
就是因为格式符使用错误导致的,所以在打印有符号和无符号数时,一定要注意格式控制符的使用
感谢阅读,继续剖析请看下回分解。