题目:
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;
}
思路分析:
- signed 是有符号的意思
- unsigned是无符号的意思
- 练习2是无符号类型以有符号类型打印
注意:
- char是有符号还是无符号是取决编译器的,在vs中char等价于signed char
- 而int在C语言中规定 int等价unsigned int
- 只要是char类型不论是有符号,都是八个比特位
上图是-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
- c也是一样进行截断
- c也需要就行提升
- 但是c是无符号类型,而%d打印的是有符号类型的
- 且无符号的数字在整形提升时全部补0,所以用0来补充到32位
同样,上图也是补码,所以也需要打印成原码, 但因为打印的是有符号整数,又因为最高的符号位是0,所以原反补是一样的,所以最后求出255。