在 ISO C90 标准中,-2147483648 是由一个负号和 2147483648 两部分组成。根据 C90 标准的规定,整数常量(不带后缀)会根据其巨细自动决定是 int 范例、long int 范例照旧 unsigned long int 范例。
2147483648 超出了 32 位 int 的最大范围(2147483647),因此编译器会把它当成 unsigned long int 范例。所以,-2147483648 其实是 - 和一个 unsigned long int 范例 2147483648 组成,由于这里的负号是尝试对一个无符号数取负,这将引发范例标题,这样的操作在 C 语言中是正当的,但会导致值的环绕(wrap around),最终得到一个很大的正数。
解决办法