为什么将这个C赋值扩展到两行会产生不同的结果?

rqqzpn5f  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(111)

此代码生成255的(不正确)结果

#include <stdio.h>

int main()
{
    unsigned char x = 0;
    x = (x-1)%16;
    printf("%d", x);

    return 0;
}

虽然这段代码产生的结果15我觉得是正确的

#include <stdio.h>

int main()
{
    unsigned char x = 0;
    x--;
    x %= 16;
    printf("%d", x);

    return 0;
}

当这个意想不到的结果发生时,我正试图利用下溢对我有利。
unsigned int或任何其他无符号整数类型不会出现问题。

sgtfey8w

sgtfey8w1#

参见this post. x-1被隐式提升为signed int,实际上变成了-1. -1 % 16(因此“-1 /16的余数”)仍然是-1,然后它被转换回unsigned char,即255。

相关问题