2011-08-06 61 views
2

给出如下的程序如何识别有符号整数是否将转到-ve或+值。c中的无符号整数

int main() 
{ 
    int a=0xDEADBEEF; 
    printf("%d",a); 
    return 0; 
} 

此输出在-ve.But有没有任何简单的方法来快速识别它,而无需在Visual Studio中执行。

+0

你的意思是你想识别打印的整数是正数还是负数? –

+0

是的,在gcc中运行它:D –

回答

6

随着一些位魔术:

int negative = (input >> ((sizeof(int) * 8) - 1)) & 0x01; 

来解释它:

在C,负数为补码,其中最高位代表符号。我们首先使用sizeof(int) * 8来确定int在当前平台上有多少位。要通过右移获得最高位,我们需要移动size - 1。由于C中的右移是算术的(意思是如果最高位是1,我们从左边开始填充整数1),我们需要使用逻辑和0x01(或简单地1) )。

结果是int与值1如果输入为负,或者如果0它是正的。

如果你想在纸上做,取高字节(在你的情况下,DE),写出上半部分(D),并检查其高位是零还是一位。

+0

+1,这是一款优雅便携的解决方案。 –

+0

...仍然需要编译和运行。 –

+0

您也可以在纸上做,因为您不必写出整个数字,这比您的解决方案更容易。 – Femaref

0

您必须知道int的宽度(值的位数)才能决定。

您还必须在格式字符串末尾输入\n以确保有输出。

3

查看该值是否小于0x80,0x8000,0x80000000或0x8000000000000000,具体取决于类型的位深度。如果它小于那么它是正数,否则是负数。

1

如果第一位(符号位)为1,则该值为负值。否则,这是积极的。

顺便说一句,与正数的数量相比,还有一个负数。

0

0xDEADBEEF大于系统上的INT_MAX0x7FFFFFFF),因此转换为int是实现定义的。常见的二进制补码实现将其定义为将模2*INT_MAX+2简化为范围[INT_MIN,INT_MAX]