请输出以下程序的结果
练习一:
#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); // a = -1, b = -1, c = 255
return 0;
}
解析:
- -1 的二进制存储 1111 1111
- unsigned char 无符号字节型
练习二:
#include <stdio.h>
int main()
{
char a = -128; // 1000 0000
printf("%u\n", a); // 4294967168(1111 1111 1111 1111 1111 1111 1000 0000)
return 0;
}
解析:
- %u 输出无符号整型(unsiged int),能表示的整数范围是0~4294967295
- 类型由低位转高位(触发“提升”):补符号位(1),没符号位补 0
练习三:
#include <stdio.h>
int main()
{
char a = 128; //128(1000 0000)
printf("%u\n",a); //4294967168(1111 1111 1111 1111 1111 1111 1000 0000)
return 0;
}
解析:
- 128表示为1000 0000,这里发生溢出,因为 a 为 char类型,而且第一位为1,为符号位,表示负数,即为-128
练习四:
#include <stdio.h>
int main()
{
int i = -20; // 1111 1111 1111 1111 1111 1111 1110 1100
unsigned int j = 10; // 0000 0000 0000 0000 0000 0000 0000 1010
printf("%d\n", i + j); // -10
printf("%u\n", i + j); // 4294967286(1111 1111 1111 1111 1111 1111 1111 0110)
return 0;
}
解析:
- int 与unsigned int参与运算或者比较大小时,int 均转为unsigned int型
练习五:
#include <stdio.h>
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%d\n", i);
// 输出 0后,从-1(1111 1111 1111 1111 1111 1111 1111 1111)开始递减
printf("%u\n", i);
// 输出 0后,从4294967295(1111 1111 1111 1111 1111 1111 1111 1111)开始递减
}
return 0;
}
解析:
- 无符号数一直大于等于 0
练习六:
#include <stdio.h>
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i; // a[127] = -128;a[128] = 127; a[129] = 126
}
printf("%d",strlen(a)); //255 (a[255] = 0)
return 0;
}
解析:
- char 的取值范围00000000~11111111(0 ~ 127, -128 ~ -1)
练习七:
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0; i <= 255; i++)
{
printf("hello world\n"); // 陷入死循环
}
return 0;
}
解析:
- unsigned char 取值范围0~255,超过255又回到0
如有不同解释,欢迎留言指出!