1、
//1.
//输出什么?
#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; }
大多数编译器默认char类型默认为signed char ,
-1的原码100000000000000000000000000001
-1的反码1111111111111111111111111111111110
-1的补码1111111111111111111111111111111111
吧-1放在char类型的a中,因为char类型只有1个字节所以会发生整形截断。也就是存入a,b,c的是
11111111
在打印时打印的是有符号的整形,发生整形提升。整型提升时,有符号类型的补符号位,无符号类型补充0。
所以发生整型提升后的a,b,c分别是
a 11111111111111111111111111111111
b 11111111111111111111111111111111
c 00000000000000000000000011111111
因为a,b的符号位是1所以求得a,b为-1,c的符号位是0,c为255。
2、
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0; }
-128 10000000000000000000000010000000
反码 11111111111111111111111101111111
补码 11111111111111111111111110000000
存入a中发生整形截断。
a 10000000
a是有符号数,打印a时发生整型提升补符号位1
11111111111111111111111110000000
因为打印的是无符号数,所以原反补相同。
打印结果的二进制形式也就是这样结果为:4294967168
3、
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0; }
与上题相似
128 00000000000000000000000010000000
反码 01111111111111111111111101111111
补码 01111111111111111111111110000000
存入a中发生整形截断
10000000
后面的与上题相同。
4、
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
//按照补码的形式进行运算,最后格式化成为有符号整数
-20 10000000000000000000000000010100
反:11111111111111111111111111101011
补:11111111111111111111111111101100
10 00000000000000000000000000001010
反:11111111111111111111111111110101
补:11111111111111111111111111110110
补码 i+j:11111111111111111111111111110100
因为符号位是1,所以说转化为原码就是-10