【发布时间】:2011-03-02 15:30:08
【问题描述】:
在 C 编程语言中,unsigned int 仅用于存储正值。但是,当我运行以下代码时:
unsigned int x = -12;
printf("%d", x);
输出仍然是-12。我以为它应该打印出来:12,还是我误会了什么?
【问题讨论】:
-
你在对编译器撒谎:你告诉编译器你会给
printf一个int("%d"),但是你给它一个unsigned。 不要对编译器撒谎 -
@Joachim:编译器正在执行“通常的算术转换”(参见 3.2.1.5)。 "... 否则,如果任一操作数的类型为 unsigned int,则另一个操作数将转换为 unsigned int ..." 并且
-12转换为无符号结果(UINT_MAX + 1) - 12。 -
@Joachim:gcc 标志
-Wsign-conversion(包含在-Wconversion中)可用于对此发出警告。如您所知,它不属于-Wall或-Wextra。 -
@Joachim:我看不出编译器应该发出警告以完全合理地使用该语言的原因。遗憾的是,C 整数语义的细节通常不会在书籍和课程的早期介绍,但这并不是为不了解他们正在编程的语言的人定制编译器首选警告级别的真正借口......
-
@R: GCC 编译器对 user 的
-Wall说谎实际上是一种耻辱,因为它没有打开"全部”警告。
标签: c