int main()
{
int a = -20;
unsigned int b = 10;
printf("a+b=%d", a + b);
return 0;
}
a+b=-10
-20的原码: 10000000000000000000000000010100 -20的反码: 11111111111111111111111111101011 -20的补码: 11111111111111111111111111101100 10的补码: 00000000000000000000000000001010 相加后的补码: 11111111111111111111111111110110 反码: 11111111111111111111111111110101 输出的原码: 10000000000000000000000000001010 即%d打印的值是-10。
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
return 0;
}
上述代码运行死循环。原因是对无符号数来说取值永远大于等于0。(无符号数的取值范围是0~255)。
#include <string.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d",strlen(a));
return 0;
}
255
::: tip
strlen计算长度是到“\0”为止,“\0”的ASCII码是0,即可以通过0来确认停止。
:::
数组a中的元素类型是char,char类型变量表示值的范围是-128127。即任何值放入char类型的变量中,都会被转化成-128127之间的数字。
a[i]=-1-i的计算结果是从-1递减到-999,存放进char类型的数组时实际存放的内容是:-1到-128和127到0。共255个数字。
如下图,在-1-i计算到-128时,-128的下一位是127(1000000-11111111=01111111),再向下每次减去1,直到计算到结果为0,再减去1变为-1,进入循环,直到i的值到达999,数组中存放的值仍然是-128到127之间的数字。strlen需要找到0停止计算长度,存进数组中的数字从-1开始到-128,再到127,再到0,strlen停止计算,在遇到0之前从-1到-128是128个数字,127到1是127个数字,共255个字符。
int main()
{
unsigned char i = 0;
for (i = 0; i <= 255; i++)
{
printf("Hello world\n");
}
return 0;
}
上述代码的结果是死循环。 原因是无符号数的范围是0~255,i<=255的条件恒成立。当i++的结果到255后,+1变为0(发生截断后),进入循环。
::: danger 当代码中需要使用无符号数时,要警惕条件设置可能导致死循环的问题。 :::