代码一:
#include<stdio.h> 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; }
分析思路:
- 写出-1这个数的二进制补码
- 当类型为char的时候数据需要截断储存
- 当数据以整数类型打印的时候就要发生整型提升、
- 如下分析:
- 当把-1的补码放到char 类型的数据中存储是会发生截断如图所示:
- 所以a,b,c,中存放的都是11111111
但是当以整数的形式取出来的时候就不一样了,会发生整型提升。
所以%d打印a的值为-1.
所以%d打印b的值为-1.
所以%d打印c的值为255
程序运行结果如图所示:
代码二:
#include<stdio.h> int main() { char a = -128; printf("%u\n", a); return 0; }
思路分析:
- 写出-1这个数的二进制补码
- 当类型为char的时候数据需要截断储存
- 当数据以%u打印的时候就要发生整型提升
- -128在char类型中的储存:
- 所以程序输出的结果为:4294967168
实际的结果:
结论:
负数的整形提升
所以整形提升的时候,高位补充符号位,即为1
正数的整形提升
所以整形提升的时候,高位补充符号位,即为0
无符号整形提升,高位补0
原码——>反码
符号位不变其他位按位取反
反码——>补码
反码+1
补码到原码方式一:
补码——>反码
补码-1
反码——>原码
符号位不变其他位按位取反
方式二:
补码按位取反之后+1得到原码
以上就是数据储存的练习。