scanf%u负数?

ron*_*ino 5 c printf unsigned scanf format-specifiers

我已经尝试了scanf("%u",&number),我输入了负数,问题就在于printf("%d",number)我得到负数.我以为这会阻止我阅读负数.是scanf("%d",&number)scanf("%u",&number)真的一样吗?或者只是为了可读性.

我在做一些叫做未定义行为的事情吗?

编辑:

维基百科我读到这个:

%u:扫描十进制无符号整数(注意,在C99标准中,输入值减号是可选的,因此如果读取减号,则不会出现错误,结果将是负数的二进制补码,可能是非常大的价值.

阅读SO答案及以上,有点令人困惑.有人能说得更清楚吗?

Sou*_*osh 2

是的,无论哪种方式,这都是未定义的行为。

考虑到变量number的类型为unsigned%din需要int 类型printf()的参数,传递的类型为 UB。signedunsigned

OTOH,如果number是有符号类型,则用于%u扫描的首先是UB。

正如你可能所预料的那样

[...]阻止我读取负数

格式说明符存在以防止不正确的输入。如果格式说明符与提供的参数不匹配,则会调用未定义的行为

引用C11附件 J.2,调用 UB 的场景,

格式化输入函数之一的转换结果无法在相应的对象中表示,或者接收对象没有适当的类型