你好,我正在学习C语言,我在声明 signed int testing=4294967295;
时犯了一个错误。虽然我知道可以创建一个这样大小的无符号整数,但是我认为有符号整数的范围是-2,147,483,648到2,147,483,647,因此我期望会发生溢出错误,但是并没有发生。请问有人能告诉我为什么会这样吗?
signed int
溢出会导致未定义的行为。编译器可能会或可能不会产生任何警告或错误。
整数溢出是未定义行为的一个例子。
溢出并不是错误,它只是int类型的一种行为。我猜在你的情况下,当发生溢出时,你的int类型变量所存储的值与你设定的值不同。
尝试打印int类型的值。根据你的设置和硬件,可能会发生很多奇怪的事情,但你会看到一些奇怪的行为。
C标准规定:
如果在表达式求值过程中出现异常情况(即,结果在其类型的表示范围内无法定义或不可表示),则行为未定义。
这意味着如果发生溢出,你就没有任何保障了 - 没有任何一种行为是保证的。无符号类型是一个特殊情况,永远不会发生溢出。
-Wall
;-Wextra
提供更多的警告,但我不推荐使用后者)。警告很可能会在编译时捕捉到这样的问题(尽管编译器并非必须这样做,大多数都会)。 - Tim Časlong
(或常量所具有的任何类型)到int
的实现定义转换(或引发实现定义的信号)。 - mafso-Wextra
)? - Spikatrix-Wextra
选项的观点(提示:这就是为什么它没有包含在-Wall
选项中的原因!),尽管显然在SO上赞同的人不太多。 - Tim Čas