数据在内存中是按照补码的形式存储的
在这里容易混淆概念的有以下练习题
1. 程序会输出什么?
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a = %d, b = %d, c = %d\n", a, b, c);
system("pause");
return 0;
}
此时计算机中,-1是这样存储的
在c语言中char默认为有符号类型,那么在打印的时候,a, b的打印结果应该一样,c是无符号类型所有的比特位都表示数据。
可是现在是要按照%d输出,整型需要4字节,这就涉及到了比特位填充的问题
比特位填充的是变量自身的类型。也就是说,有符号数填充的符号位,无符号数填充的是0
那打印出来的结果就是这样的:
2. 程序会输出什么?
int main()
{
char a = -128;
printf("%u\n", a);
system("pause");
return 0;
}
很明显a是有符号数,当它在进行比特位扩充的时候就应该扩充的是符号位1
那当a按照%u进行无符号打印的时候,那打印出来的结果转成二进制就是这样的:
1111 1111 1111 1111 1111 1111 1000 0000(25个1+7个0)
3. 程序会输出什么?
int main()
{
char a = 128;
printf("%u\n", a);
system("pause");
return 0;
}
那打印出来的结果转成二进制就是这样的:
1111 1111 1111 1111 1111 1111 1000 0000(25个1+7个0)
4. 程序会输出什么?
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
system("pause");
return 0;
}
按照补码形式进行运算结束后,无符号和有符号最终统一格式化为有符号整数
那打印出来的结果就是这样的:
5. 程序会输出什么?
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
system("pause");
return 0;
}
答案是:陷入死循环
很明显无符号数是永远>=0的
这个打印结果就是9 -->0,再从很大的数字往下减,减为0之后,再从很大的数字往下减。。。
6. 程序会输出什么?
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d\n", strlen(a));
system("pause");
return 0;
}
刚开始肯定是:-1,-2,-3,......,-128
接下来呢?
那就是:127,126,......,1,0,.......
strlen在读的时候遇到0就会停止读取数据
那打印出来的结果就是这样的:
7. 程序会输出什么?
int main()
{
short int num = 32767;
short int a = num + 1;
printf("%d\n", a);
system("pause");
return 0;
}
那打印出来的结果就是这样的:
8. 程序会输出什么?
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
puts("hello world\n");
}
system("pause");
return 0;
}
答案是:陷入死循环
unsigned char类型一个字节,它能表示的最大数是255(1111 1111),循环条件永远成立。。。