整数的存储方式
char类型在存储时是按照ASCII码值进行存储,存储方式与整型一致
有符号数与无符号数
char | 一个字节 |
---|---|
signed char | |
unsigned char |
int | 四个字节 |
---|---|
signed int | |
unsigned int |
各种类型数据均分为有符号和无符号类型,当定义一个int类型或char类型的数,计算机默认其为有符号类型。
有符号数与无符号数
为了区分正负数
有符号数二进制首位是符号位,0正1负;
无符号数二进制首位是数值位,只用于正数
有符号char类型,十进制数值表示范围是(-128~127);
无符号char类型,十进制数值表示范围是(0~255);
整数以补码形式在内存中存储
有符号数和无符号数均有原码、反码、补码
原码 | 将正负数转化成二进制 |
---|---|
反码 | 符号位不变,对剩余二进制位取反 |
补码 | 反码+1 |
最后将32位的补码转化为8个十六进制(每4位二进制,转化成1位16进制),32个二进制位转换成为8个十六进位
补码->原码:取反+1
int a=-10;
//1000 0000 0000 0000 0000 0000 0000 1010---原码
//1111 1111 1111 1111 1111 1111 1111 0101---反码
//1111 1111 1111 1111 1111 1111 1111 0110---补码
第一位是符号位,0为正,1为负
//0x FFFFFFF6----十六进制存入内存
- 将数据转化为十六进制后(十六进制,每两个数代表一个字节);
- 会将十六进制数按一定规律存入内存(每一块内存也有一个十六进制的编号);
- 但是,并不一定按照FFFFFFF6的形式存入内存;
为什么需要补码:用于减法计算
计算机计算用补码,人看到的是原码
ab是有符号,c是无符号
char类型也有有符号数和无符号数
char | |
---|---|
0000 0000 | 0 |
0000 0001 | 1 |
… | |
0111 1111 | 127 |
1000 0000 | -128 |
… | |
1111 1110 | -2 |
1111 1111 | -1 |
127+1=-128 | 0111 1111+1=1000 0000 |
---|---|
-1+1=0 | 1111 1111+1=1 0000 0000 |
char类型只有一个字节八位,只能保存-128~127之间的值,-1+1后,会将1省略变成0。