目录
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