第一题:
int main()
{
signed char a[1000];
int i = 0;
for (i = 0; i < 1000; ++i)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
system("pause");
return 0;
}
这道题的运行结果是255。
这里是把从-1到-1000的数存到数组a中,-1存放在内存中是以补码的形式11111111(char类型的8个bit位),再把-2存进数组(补码:11111110),一直到存到-128(补码10000000)。但有符号char类型数据所能表示的最小的数就是-128,当-128再减1时,(10000000+11111111=01111111)最高位就会溢出,-129需要9位才能存储下来,而char类型的只有8位,所以最高位被丢弃,所以减出来的结果是127。
所以实际上这个数组里面存的是-1~-128~127~0,一共存了256个元素,但最后一个是0,也就是‘\0’的assic码值,当strlen遇到它时计数就停止,但0并没有记录进去,所以strlen(a) == 255。
第二题:
下面代码运行起来输出什么?
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;
}
答案:a=-1,b=-1,c=255
c是无符号整型
第三题:
int main()
{
char a = -128;
printf("%u\n", a);
system("pause");
return 0;
}
答案:4294967168
这里把一个char类型的数据按unsigned int 输出,会发生整型提升。