2014-02-28 38 views
0

什么16位十六进制签署int值可与下面的代码:十六进制值等于负值

#include <stdio.h> 

int main() { 
    while (1) { 
    int i; 
    if (scanf("%x", &i) != 1) break; 
    printf("%d %s -%d\n", i, (i == -i) ? "==" : "!=", i); 
    } 
    return 0; 
} 

必须有一定的价值与此返回“==”,比“0”。

+3

为什么必须在那里?十六进制与这个有什么关系? –

+0

这是一个任务的摘录,但问题很简单。十六进制只是二进制位的表示。 – user3348713

+0

您在这里的任何地方都没有使用十六进制 - 除非我们没有看到任务的一部分,否则这并不相关。整数没有固有的(十进制,十六进制,二进制)表示形式,除非将它们写入字符串。 –

回答

1

8000(十六进制)将是答案(在16位机器上)。

这是因为当您用2的补码取消8000时,您将补码加1,即7FFF + 1或返回8000。在十进制表示中,编号为-32768

在给定代码的情况下,这将是真的如果int对于给定的编译器和处理器是16位。否则,i将需要声明为short int或只是short

+0

建议'0x8000'是'-32768'而不是'-65536'。 – chux

+0

@chux hah yep很好的接收,谢谢。规则在计算机中:总是以2为因子;) – lurker

+1

[在2倍的范围内](http://en.wiktionary.org/wiki/close_enough_for_government_work)有时足够好。 – chux