文章目录
数据类型的分类
整形在内存中的存储
浮点数在内存中的存储
一.数据类型的分类
不同数据类型的意义:根据不同的数据类型的范围,来选用适合的数据类型节约内存空间。
1.整形
char,short,int,long有有无符号之分,但统归于整数。字符在存储时, 本质存储的是ASCII码,所以也属于整数类型。
2.浮点数
3.构造类型(自定义类型)
4.指针类型
5.空类型
二.整形在内存中的存储
1.原码,反码,补码
整数在内存上存放的二进制。整数的二进制表示形式有三种:原码,反码,补码。正数的原码,反码,补码是相同的。三种表示法均与符号位和数值为两部分组成。符号位是最高位,剩余的都是数值位。
原码:按照正负形式翻译成的二进制码。
反码:除符号位外全部取反(0变成1,1变成0).
补码:反码的值+1.
正数的原码,反码,补码是相同的。
2.小端存储和大端存储
小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把高位字节的内容存放在高地址处。
大端字节序存储:把一个数据的低位字节的内容,存放在高地址处,把高位字节的内容存放在低地址处。
3.如何判断大小端
int a = 1;
//在内存中小端存储:01 00 00 00
//在内存中大端存储:00 00 00 01
if((*(char*)&a)==1)
{
printf("小端存储\n");
}
else
printf("大端存储\n");
4.整数在内存中的存储
三.整数在内存中存储例题
例1:
-1的原码是1000 0000 0000 0000 0000 0000 0000 0001,取反+1后是补码:1111 1111 1111 1111 1111 1111 1111 1111,存入char类型a中,因为char类型是一个字节,所以装不下,发生了截断。截断会把低字节位的部分保留,所以存入a中的是1111 1111。以%d的形式打印(以十进制的形式打印有符号整数),而a,b,c都是char类型,会发生整型提升补齐。a和b补齐,因为a和b是有符号,会补齐1,32位都是1,转换为源码后为-1。c是无符号char,高位会全补为0,变成正数,正数的原反补是一样的,求得为255。
例2:
求得-128的原码,反码,补码。存入a中发生截断,又以十进制无符号正数类型打印,会发生整型提升,补齐的数为符号位,补齐1,又因为是无符号数,原码反码补码相同,求得是一个很大的数。
例3:
因为和例2一样发生截断,虽然正负号不一样,但是存入char的二进制是一样的,所以解题过程一样,结果一样。
例4:
求得-20的原码,反码,补码以及10的原码,相加得到新数字的补码,又因为以有符号的十进制整数打印,不能忽略符号位,转换为原码后为-10。
例5:
因为是无符号整形,当i为1发生减减后,i会变成32位个1,因为无符号,所以是极大值。
例6:
i的取值0~999,理论上a[i]的取值是-1,-2,-3...1000。但是a数组是char类型的,取值位-128~127。所以数组中存储的是-1,-2,-3......1000,-1,-2......依次循环。