我已经尝试了scanf("%u",&number)
,我输入了负数,问题就在于printf("%d",number)
我得到负数.我以为这会阻止我阅读负数.是scanf("%d",&number)
和scanf("%u",&number)
真的一样吗?或者只是为了可读性.
我在做一些叫做未定义行为的事情吗?
编辑:
从维基百科我读到这个:
%u:扫描十进制无符号整数(注意,在C99标准中,输入值减号是可选的,因此如果读取减号,则不会出现错误,结果将是负数的二进制补码,可能是非常大的价值.
阅读SO答案及以上,有点令人困惑.有人能说得更清楚吗?
阅读scanf
手册我遇到这一行:
一个可选的'm'字符.这用于字符串转换(%s,%c,%[),
有人可以通过简单的例子来解释它,在某些情况下说明这种选择的区别和需要吗?
阅读有关整数提升和整数转换等级的信息,我找到了此链接
- 1.如果两个操作数具有相同的类型,则无需进一步转换。
- 2.否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,则将具有较小整数转换等级的操作数转换为具有较大等级的操作数的类型。
3.否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带符号整数类型的操作数将转换为无符号整数类型的操作数的类型。
4,否则,如果带符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为带符号整数类型的操作数的类型。
5.否则,两个操作数都将转换为与带符号整数类型的操作数类型相对应的无符号整数类型。
要点1 2 3完全清楚,但是我仍然没有给出案例4和5的示例。有人可以提供有关任何实现的示例吗?
据我所知,整数转换等级为:
_Bool <char <short <int <long <long long int
无论与类型相关的字节大小是相等还是更高。对?
关于升级或从一种类型转换为另一种类型。添加到最低类型零或1的位还是左极限位对此有影响?
我想知道位视图中的过程如何进行,尤其是对于转换。
对于整数促销,毫无疑问,它始终可以保留值和符号。
据我所知,参数的格式说明符太少被认为是未定义的行为(格式说明符的参数太少也是未定义的行为).这适用于:
printf("%1$d %1$d", 5);
Run Code Online (Sandbox Code Playgroud)
PS使用"%1$d"
as格式说明符是POSIX添加的函数族的扩展printf
.