【发布时间】:2015-10-19 14:00:44
【问题描述】:
我正在从 Stephen Prata 的“C Primer Plus”一书中学习 C。在第 4 章中,作者指出在printf() 中,%o 和 %x 分别表示 unsigned 八进制整数和 unsigned 十六进制整数,但在scanf() 中,% o 和 %x,分别解释 signed 八进制整数和 signed 十六进制整数。为什么会这样?
我在VS 2015中写了如下程序来检查作者的说法:
#include <stdio.h>
int main(void)
#pragma warning(disable : 4996)
{
int a, b, c;
printf("Enter number: ");
scanf("%x %x", &a, &b);
c = a + b;
printf("Answer = %x\n", c);
while (getchar() != EOF)
getchar();
return 0;
}
代码证明了作者的说法。
如果输入有一对整数,其中正整数的绝对值大于负整数的绝对值,那么一切正常。
但是,如果输入有一对整数,其中正整数的绝对值小于负整数的绝对值,那么输出就是您对 unsigned 的期望 2 的补码。
例如:
Enter number: -5 6
Answer = 1
和
Enter number: -6 5
Answer = ffffffff
【问题讨论】: