一.数据类型
整型
char
signed char
unsigned char
字符类型在内存中存储的是他们的ASCII值 所以也可以看作是整型
对于char来说 char是有符号char还是无符号char取决于编译器的 一般情况是有符号char 相当于signed char
short
signed short
unsigned short
对于short类型来说 short就是有符号的short 和signed short一样
int <-->signed int unsigned int
long<--> signed long unsigned long
浮点型
double//双精度浮点型
float//单精度浮点型
3.构造类型
数组类型
结构体类型
枚举类型
联合类型
二.整型在内存中的存储
1.数据在内存中都是以二进制的形式存储的 整型以二进制的方式表示有三种 :原码 反码 补码
2.一般情况下整数的二进制序列是由符号位和数据位组成的 最高位为符号位 0表示正数 1表示负数
正整数的原码 反码 补码是一样的
int a = 10; 00000000000000000000000000001010 10的二进制序列 是原码 也是反码 也是补码
负整数的原码 反码 补码 是需要计算的
int a = -10; 10000000000000000000000000001010 -10的原码
11111111111111111111111111110101 -10的反码 在原码的基础上符号位不变 其他位按位取反
11111111111111111111111111110110 -10的补码 在原码的基础上+1
5.对于整数来说内存中存储的是补码
验证1:
-10的补码 1111 1111 1111 1111 1111 1111 1111 0110 我们知道4个二进制位表示一个16进制位
0x f f f f f f f 6
我们通过调试看到的内存是0xfffffff6 所以内存中存储的是补码
验证2:
计算1-1 我们知道cpu只有加法器 要计算1-1就得转化成1+(-1)
00000000000000000000000000000001 1的原码 反码 补码
10000000000000000000000000000001 -1的原码
11111111111111111111111111111110 -1的反码
11111111111111111111111111111111 -1的补码
假设内存中的是原码:
00000000000000000000000000000001 1的原码
10000000000000000000000000000001 -1的原码
//相加
10000000000000000000000000000010 原码 转化成10进制为-2
1-1的结果很明显不为-2 所以原码计算的结果是错误的
假设内存中存储的是补码:
00000000000000000000000000000001 1的补码
11111111111111111111111111111111 -1的补码
//相加
100000000000000000000000000000000 33位 此时int类型只能放32位 所以要将高位的1丢弃
00000000000000000000000000000000 这就是相加的二进制补码结果 转换成原码也一样 0
所以这个计算结果是正确的 所以整数在内存中是以补码的形式存储的
三.大小端(以字节为顺序的存储方式)
大端字节序存储:把一个数低位字节处的数据存放到高地址处,把一个数的高位字节处的数据存放到低地址处(顺着存储)
int a = 0x11223344; 11就是高位字节处的数据 44就是低位字节处的数据 2个16进制位表示一个字节
11 22 33 44
低地址-->高地址
小端字节序存储:把一个数高位字节处的数据存放到高地址处,把一个数的低位字节处的数据存放到低地址处(倒着存储)
int a = 0x11223344;
44 33 22 11
低地址-->高地址
四.拓展
讨论一下数据类型的取值范围
char类型 一个char类型能放8个bit位 把这8个二进制bit位的所有情况写出来如下:
二进制序列 转换为10进制 这些数据都是在内存中的补码 在转化10进制之前要转换成原码
00000000 0
00000001 1
00000010 2
...
01111111 127
10000000 -128
10000001 -127
...
11111110 -2
11111111 -1
所以有符号char的取值范围为-128~127 就是-2^7 ~ 2^7-1
无符号char的取值范围就是0 ~ 255 就是 0 ~ 2^8-1
通过char我们可以推出short类型的取值范围
有符号的short -2^15 ~ 2^15-1
无符号的short 0 ~ 2^16-1
int long 类型的也可以通过这个规律来计算
需要注意的是 有符号的类型反复+1的变化实际上是一个循环
举例:
有符号char类型的数据从0开始反复+1 一直加直到127的时候 在+1就变成了-128
从-128+1 一直加到-1 -1在+1就变成了0 就是这么一个循环 而不是我们日常生活中的+1会一直变大 像是一条直线 这里的类型加1更像是一个园