据我所知,十进制和十六进制只是表示(比方说)int
。为什么我可以用十六进制表示一个大于MAXINT的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
}
由于我的言论表明,这两个十进制数的总和大于MAXINT大的数字。这个数字在打印成小数时溢出了(正如我所期望的那样),但是当以十六进制打印时,它看起来非常好。有趣的是,如果我继续添加到这个数字,并导致它再次溢出,它将返回正确表示十进制数字。十六进制数字总是正确的。
任何人都可以解释为什么这是这种情况。
TIA
因为'%x'将数字作为** unsigned ** int处理。 – litelite
'%x'是* unsigned *'int'的格式说明符。所以从技术上来说,使用它与不符合unsigned的符号是未定义的行为。 –
那么我们首先称之为“更大”。 -1469994584也是无符号的 - 比INT_MAX大,并且还将十六进制结果与无符号进行比较。 – harold