-
- 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 a=-1 与 signed char b =-1
- 因为在VS中char和signed char是一样的,所以二者结果一样。
- 因为是char类型,只需要有八个比特位,所以需要进行截断
PS: 截断是指从右到左截断八个比特位。
- 变量a和b因为类型是等价的,所以一样
- 而a和b的打印的格式是%d,%d是打印成有符号的整型,因为打印的格式是整型,所以需要进行整型提升
- 因为截断后a的进制位中的符号位是1所以其余的全部补1补满32个比特位
- 而这个提升后是补码,最后打印出来的是原码,所以需要补码转化为原码
- 整型提升详情:http://t.csdn.cn/MzD7I
同样,上图也是补码,所以也需要打印成原码, 但因为打印的是有符号整数,又因为最高的符号位是0,所以原反补是一样的,所以最后求出255。
char——>%d打印:
- 原反补,现变成补码
- 从右到左截断八个比特位
- 进行整型提升,截断后的最左边是0全部补0,是1全部补1,补满32位(有符号的char类型),无符号char类型只能补0补满
- 整型提升后的是补码,%打印的是原码,所以需要进行原反补的操作,变成原码。