1.
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d ,b=%d,c=%d", a, b, c);
system("pause");
return 0;
}
结果为 -1,-1,255
分析:
a是char,可以放8个比特位,但它是整数有32个比特位,
1111111111111111111111111111111取8位,a的存储为11111111
,要%d输出所以a整型提升,a是有符号位,高位补符号位变为1111111111111111111111111111111,所以a输出为-1;b与a相同,c为无符号类型,补高位补0,变为00000000000000000000000011111111,%d输出,符号位为0,是正数,正数的原反补码相同所以为255.
2.
int main()
{
char a = -128;
printf("%u\n", a);
system("pause");
return 0;
}
答案为:429496716
分析:
a是-128,-128的原码为1000000000000000000000010000000,取反加1的补码为111111111111111111111111110000000,char类型能存储8位,为10000000,%u无符号整型打印,整形提升为11111111111111111111111110000000,无符号打印,所以11111111111111111111111110000000为原码,即为所求。
3
int main()
{
char a = 128;
printf("%u\n", a);
system("pause");
return 0;
}
结果和上题相同`
4.
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i+j);
system("pause");
return 0;
}
运行结果为:-10
分析:
-20原码:10000000000000000000000000010100补码为:11111111111111111111111111101100,10补码为000000000000000000000000001010 ,相加结果为111111111111111111111111110110,%d打印是原码,补码-1取反为1000000000000000000000000001010是 -10
5.:
int main()
{
unsigned i ;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
system("pause");
return 0;
}
结果为死循环,因为unsigned定义的是没有小于0的数
6.
int main()
{
char a[1000];
int i;
for (i = 0; i <1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
system("pause");
return 0;
}
结果为255
分析:
// -1 -2 -3 —— —— —— -128 127 126 ——————3 2 1 0 -1 -2 -3 strlen找到0截至前面是255个
7.
int main()
{
short num = 32767;
short int a = num + 1;
printf("%d\n",a);
system("pause");
return 0;
}
结果为-32768
**分析:**32767是2的16次方-1,短整型表示的正的最大值,加1变为-32768,短整型能表示的最大值加1变为最小值,char最大的127加1变为-128.
8.
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
puts("hello world\n");
}
system("pause");
return 0;
}
结果为死循环,因为unsigned最大值为255。