【发布时间】:2018-02-02 14:02:00
【问题描述】:
据我所知,十进制和十六进制只是(比如说)int 的表示。
这意味着如果我定义一个整数,x 我应该能够将x 打印为:
- 小数点:
printf("%d", x); - 十六进制:
printf("%x", x);
我不明白当x 超过 MAXINT 时它的行为如何。
以下面的代码为例:
#include<stdio.h>
int main(int argc, char** argv) {
// Define two numbers that are both less than MAXINT
int a = 808548400;
int b = 2016424312;
int theSum = a + b; // 2824972712 -> larger than MAXINT
printf("%d\n", theSum); // -1469994584 -> Overflowed
printf("%x\n", theSum); // A861A9A8 -> Correct representation
}
正如我的 cmets 所建议的,这两个十进制数之和是一个大于 MAXINT 的数字。这个数字在打印为十进制时溢出(正如我所料),但当打印为十六进制时,它似乎完全没问题。
有趣的是,如果我继续添加这个数字,并导致它再次溢出,它会返回正确表示十进制数。十六进制数总是正确的。
谁能解释一下为什么会这样。
TIA
【问题讨论】:
-
因为
%x将数字处理为 unsigned int。 -
%x是 unsignedint的格式说明符。所以从技术上讲,将它与不适合无符号的有符号一起使用是未定义的行为。 -
我们首先将什么叫做“更大”。 -1469994584 也是无符号的,大于 INT_MAX 并且您还比较了十六进制结果,就好像无符号一样。
-
我希望有人写一个完整的答案而不是 cmets。 OP已经很困惑了;短的 cmets 只会让它更加混乱。
-
很公平。同意。