整型在内存中的存储
1. 往内存里存一个整数
- 无符号数:原、反、补码一样
- 有符号数:
- 正数:原、反、补码一样
- 负数:补码表示
例如:
-10:有符号->负数->存它的补码
以8比特位为例
原: 1000 1010
反: 1111 0101
补: 1111 0110 ->最终存入内存中的-10
2. 存内存中取一个整数
看是什么类型(有符号整数 / 无符号整数)
- 无符号整数:直接取
- 有符号整数:
- 正数:直接取
- 负数:补->原再取
例如:
#include <stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d\n", a, b, c);
return 0;
}
输出:-1,-1,255
a和b的结果是一样的,这里就分析下a:
存:a是有符号数负数
a = -1
原: 1000 0001
反: 1111 1110
补: 1111 1111
1.存的时候不考虑类型,直接存 -1 的补码 1111 1111
2.在%d输出的时候,会发生整型提升,整型提升默认的是按照变量的原始类型添加前面的比特位,这里的a是有符号的所以前面添加 1,变为 11111111 11111111 11111111 11111111,这样的话用%d输出,结果是 -1。
c = -1
还是一样的,存的时候不考虑类型,存 -1 的补码 1111 1111
在%d输出的时候,整型提升,添加比特位,这里的c是unsigned类型的,所以前面添加 0,变为:
00000000 00000000 00000000 11111111
这样,以%d输出就是255咯。