为什么';当我使用大整数时,tc返回一个错误

为什么';当我使用大整数时,tc返回一个错误,c,overflow,C,Overflow,您好,我正在学习C,我相信我在声明时犯了一个错误 signed int testing=4294967295我不认为这会起作用,因为虽然我知道我可以创建这样大小的无符号int,但我认为有符号int的范围是-2147483648到2147483647,因此我预期会出现溢出错误,但我没有得到。有人能告诉我为什么会发生这种情况吗?signed int溢出会导致未定义的行为。编译器可能会也可能不会产生任何警告或错误 C11:3.4.3(p3): 未定义行为的一个例子是整数过流的行为 溢出不是错误。这只是

您好,我正在学习C,我相信我在声明时犯了一个错误
signed int testing=4294967295我不认为这会起作用,因为虽然我知道我可以创建这样大小的无符号int,但我认为有符号int的范围是-2147483648到2147483647,因此我预期会出现溢出错误,但我没有得到。有人能告诉我为什么会发生这种情况吗?

signed int
溢出会导致未定义的行为。编译器可能会也可能不会产生任何警告或错误

C11:3.4.3(p3): 未定义行为的一个例子是整数过流的行为


溢出不是错误。这只是一个int的值。我想在你的例子中,当溢出发生时,你的int值与你设置的值不同

尝试打印int值。根据您的设置和硬件,可能会发生很多事情,但您会看到一些奇怪的行为。

C标准规定:

如果在表达式求值期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义


这意味着,如果你得到一个溢出,你的运气-没有任何行为保证。未签名类型是一种特殊情况,从不溢出。

还应注意,强烈建议编译时始终启用警告(例如GCC或CLang中的
-Wall
-Wextra
提供更多警告,但我不推荐后者)。Warnings可能在编译时发现了这样的问题(即使编译器不是必需的,大多数都是这样)。它不是UB,因为没有溢出(在C标准的意义上),只是实现定义的从
long
(或常量的任何类型)到
int
的转换(或者引发了一个实现定义的信号)。@Tim,为什么您不推荐后者(
-Wextra
)?@Coolgay:过于冗长,有很多误报。例如,关于未使用的函数参数的警告(可能由于API而未使用,例如,使用未使用的
userdata
指针的回调)或者关于缺少字段初始值设定项的警告(当你有意用
{0}
初始化一个结构时,使编译器自动零初始化所有其他内容)。@Tim,我很惊讶地发现
-Wextra
有一些误报。我试着用谷歌搜索,但没有运气。所以我问了