1、
#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;
}
运行结果:
解析:
char a :
char 类型一个比特位——8个字节,-1 是一个整数,有四个比特位——32个字节,char 类型的 a 要存储一个整数-1,必须要发生截断:
-1的原码:10000000000000000000000000000001
-1的反码:111111111111111111111111111111111110
-1的补码:111111111111111111111111111111111111
截断后:11111111
存入char a 中,最后将 a 以整数(%d)的形式打印出来,就必须要进行整型提升(补一个数的符号位),因为这是一个有符号的整数,所以补符号位:11111111111111111111111111111111111
(存在计算机中的是补码,即这是补码),显而易见这时-1的补码,即打印的结果为-1.
signed char a :
有符号的char a 于上种情况相同,即为 -1.
unsigned char a:
因为这是一个无符号的char 类型,只能是正数,其运算的过程与有符号类型基本相同,唯一与有符号类型的区别在于整型提升时,只能补0,所以其整形提升后为:
00000000000000000011111111
由于正数的原码、反码、补码相同,所以打印结果为:255.
2、
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
运行结果:
解析:
-128的原码:1000000000000000000000001000000
反码:1111111111111111111111111110111111
补码:1111111111111111111111111111000000
存在char a 中要发生截断:10000000
%u 打印的是无符号整数,先要整型提升补符号位 1 :111111111111111111111111100000000
将其视为正数进行打印,结果为就是上面那个很大的数。
3、
#include <stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
}
运行结果 :
解析:整型的 i = -20
原码:10000000000000000000000000010100
反码:11111111111111111111111111111101011
补码:11111111111111111111111111111101100
无符号整型的 j = 10
原码 / 反码 / 补码:00000000000000000000000000001010
两个数的补码相加:11111111111111111111111111111110110
转换成反码: 11111111111111111111111111111101101
转换成原码: 10000000000000000000000000001010
计算得出值为:-10,将其打印出来。
4、
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
运行结果:
解析:答案为无限循环
因为 i 是一个无符号整数,其最小值为零,所以循环不会终止,但是当 i 的值变成负数时,打印 %u 无符号整数,负数的补码就视为整数的原码、反码、补码。再将其打印出来,其值在4294967295~0之间循环。
5、
#include<stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
运行结果:
解析:char 类型的取值范围为 127 ~ -128,本题的关键是 strlen 是求字符串长度的,我们要找到 ' \0 ' 的位置,而 ' \0 '的ASIIC码值是0.
当负数赋值给了 a[ ]时,a[ ]中只能存下 -1 ~ -128,当值小于 -128 时会发生截断,其值就会增加,到 0, -1 ~ -128 ~0,就找到了0, 128+127 = 255,字符数组的长度就是255.
6、
#include <stdio.h>
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
运行结果:
解析:因为 i 是一个无符号char类型,其取值范围为 0~ 255,for 循环内判断条件恒成立,代码死循环。