为什么unsigned int可能低于零?

Pau*_*mme 4 c variables int unsigned

我只是试图将unsigned int降低到0以下.令我惊讶的是它有效!

#include<stdio.h>

int main(void)
{
        unsigned int foo = 5;
        foo -= 10;
        printf("%d", foo);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译

clang -Weverything main.c
Run Code Online (Sandbox Code Playgroud)

这个计划回归

-5
Run Code Online (Sandbox Code Playgroud)

正如这篇文章和我的个人知识所述,这是不可能的.但为什么它会起作用呢?我错过了什么吗?是因为未定义的行为?还是printf?或者是其他东西?

das*_*ght 6

该程序用于printf将值重新解释unsigned int为有符号整数.虽然当值unsigned int也适合时,这不是问题int,但它是未定义的行为:

如果任何参数不是相应转换规范的正确类型,则行为未定义

说明:从五个"回绕"中减去十个,因此根据系统的表示得到一个大数字unsigned int.事实证明,这个大数字的位表示对应于系统上负5的表示,因此当printf将值重新解释为有符号时,将显示负数5.

为什么编译器没有任何通知?

有关可能的解释,请参阅此问答.