C语言 条件语句出现为无符号

ehxuflar  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(136)
#include <stdio.h>
#define Const_value sizeof(int)

int i = 100;
int j;
int main(){
    j = (Const_value - i > 0);
    printf("%ld, %d, %d",Const_value, i, j);
    return 0;
}

如果我知道“Const_value”为4,“i”为100,则差值为-96。在这种情况下,j的预期结果为0,因为-96〉0是一个错误语句,但当编译和执行此程序时,j = 1,我认为这是因为在计算过程中,-96被当作无符号值,但我没有看到任何语法表明这一点。
如果我把程序调整成这样:

#include <stdio.h>
#define Const_value sizeof(int)

int i = 100;
int j;
int main(){
    int x = Const_value - i;
    j = (x > 0);
    printf("%ld, %d, %d",Const_value, i, j);
    return 0;
}

我就能得到预期的结果。有什么问题吗?
输出:

4, 100, 1
4, 100, 0
yxyvkwin

yxyvkwin1#

您的Const_value宏的计算结果为size_t,它是一个无符号值,秩等于或高于int。因此,结果是无符号的。
具体地说,结果将是size_t值。换句话说,i通过整数提升规则隐式提升为size_t,然后Const_value - i出现无符号溢出,将该值 Package 为一个非常大的正值。然后测试大于零的值。

相关问题