给出如下的程序如何识别有符号整数是否将转到-ve或+值。c中的无符号整数
int main()
{
int a=0xDEADBEEF;
printf("%d",a);
return 0;
}
此输出在-ve.But有没有任何简单的方法来快速识别它,而无需在Visual Studio中执行。
给出如下的程序如何识别有符号整数是否将转到-ve或+值。c中的无符号整数
int main()
{
int a=0xDEADBEEF;
printf("%d",a);
return 0;
}
此输出在-ve.But有没有任何简单的方法来快速识别它,而无需在Visual Studio中执行。
随着一些位魔术:
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
),并检查其高位是零还是一位。
您必须知道int
的宽度(值的位数)才能决定。
您还必须在格式字符串末尾输入\n
以确保有输出。
查看该值是否小于0x80,0x8000,0x80000000或0x8000000000000000,具体取决于类型的位深度。如果它小于那么它是正数,否则是负数。
如果第一位(符号位)为1,则该值为负值。否则,这是积极的。
顺便说一句,与正数的数量相比,还有一个负数。
0xDEADBEEF
大于系统上的INT_MAX
(0x7FFFFFFF
),因此转换为int
是实现定义的。常见的二进制补码实现将其定义为将模2*INT_MAX+2
简化为范围[INT_MIN,INT_MAX]
。
你的意思是你想识别打印的整数是正数还是负数? –
是的,在gcc中运行它:D –