数据存储(练习题目2)
Suzhou 21 0
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个字符。 数据存储(练习题目2)


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 当代码中需要使用无符号数时,要警惕条件设置可能导致死循环的问题。 :::


评论区

索引目录