目录
一.数据类型的介绍
(1)整形家族
(2)浮点型家族
(3)构造类型
(4)其他
二.整形在内存中如何进行存储
(1)原,反,补
(2)大小端介绍
(3)练习
三.浮点型在内存中如何进行存储
(1)存储
编辑编辑
(2)取出
debug 版本下会死循环
release版本优化后
将代码的效果改变
一.数据类型的介绍
(1)整形家族
对于无符号数据类型的每一位都可以作为有效位存储数据
(2)浮点型家族
(3)构造类型
(4)其他
数组根据需求可以变化其元素的类型和数组大小
二.整形在内存中如何进行存储
(1)原,反,补
原码是数据的真实值
整数在内存里面存放的是补码的二进制序列
而内存窗口显示的是16进制
补码和原码相互转换是相同的,
补码取反(符号位不变)加1得到原码
原码取反(符号位不变)加一得到补码
(2)大小端介绍
剥鸡蛋从大端还是从小端剥
对于一个字节大小的数据,没有字节存储顺序可谈
大小端取决于硬件
如何代码表示机器的硬件的字节存储形式
int main()
{int a = 1;char* p = (char*)&a;if (*p == 0){printf("大端");}else if (*p == 1){printf("小端");}return 0;
}
最好将判断大小端的代码封装成一个函数
(3)练习
int main()
{char a = -1;signed char b = -1;unsigned char c = -1;printf("a = %d,b = %d,c = %d", a, b, c);return 0;
}
数据截断是发生在存储数据时
数据在使用的时候,才会进行整形提升,如char ,short 在表达式进行计算时会默认提升为整形
计算机在进行计算的时候都是以缺省整形的方式来进行计算的
注:表达式计算时讲过整形提升,讲操作符的时候
整形提升时,是按原来的数据类型进行提升的
如将char类型的数据以%u的类型打印,那么就按有符号的标准进行提升
有符号数高位全部补符号位对应的数,负数补1,正数补0
无符号数高位全部补0
int main()
{char a = -128;printf("%u\n", a);printf("%d", a);return 0;
}
打印无符号整形时,提升后的补码就是原码
而打印有符号整形时,提升后的补码要进行转换成原码
自己算一下
int main()
{char a = 128;printf("%u\n", a);printf("%d", a);return 0;
}
向上转换
有符号数和无符号数进行计算时,会将有符号数转换为无符号数进行计算
陷入死循环
-1---->4294967295
-2---->4294967294
unsigned char i = 0;
int main()
{for (i = 0; i <= 255; i++){printf("Akebi\n");}return 0;
}
unsigned int 不可能小于0
三.浮点型在内存中如何进行存储
(1)存储
小数后面加f的类型时float
小数后面不加f的类型为double