【问题标题】:How do I check whether an unsigned int variable contains a negative number?如何检查 unsigned int 变量是否包含负数?
【发布时间】:2016-05-27 06:20:31
【问题描述】:

我有以下代码:

int main()
{ 
    int i;
    unsigned int j;

    printf("Type a number:  ");
    scanf("%d", &i);

    j = i;

    if (________)
    {
        printf("Negative!\n");
    }

    return 0;
}

为了检查无符号变量“j”是否包含负数,我将在 if 语句中放入什么?

【问题讨论】:

  • 根据定义,unsigned int 不包含负数。
  • 检查等价的负int 值只需要检查最高位,如果是1,那么该无符号数将表示为负int 值——但你会在进行任何此类转换之前,必须进一步检查该值是否不超过 INT_MIN,否则您需要扩展为 long 值。
  • 你的答案是if (i >> 31 & 1) printf ("value is negative\n");

标签: c unsigned-integer


【解决方案1】:

您可以检查变量i,例如

if ( i < 0 )
{
    //...
}

或者你可以写例如

if ( j > INT_MAX )
{
    //...
}

因为int 类型的非负值的内部表示与unsigned int 类型的相同值的内部表示一致。至少它适用于整数的 2 补码表示。

最后你可以检查符号位了。

【讨论】:

  • 请注意,如果值为负零,则可以设置符号位(对于符号幅度系统)。
【解决方案2】:

你可以这样做:

  if((int)j < 0) 
  {
   printf("Negative!\n");
  }

【讨论】:

  • 这很可能(但不能保证)有效。将大于 INT_MAX 的值转换为 int 会产生实现定义的结果。
【解决方案3】:

这是一种方法:

#include<stdio.h>
/* This is in easier to verify example.
 * I have used char to represent integers that fits in one byte.
 * char is one byte in my system
 * In case of an overflow, the numbers are wrapped around.
 * You could check with bigger types as you please.
 */

int main(void)
{
unsigned char x;
char y;
        printf("Size of char is %zd\n",sizeof(char));
        printf("Enter an integer : ");
        scanf("%d",&x);
        y=x;
        printf("Number is %s when converted to signed\n",\
                             (y>=0?"positive":"negative"));
return 0;
}

使用INT_MININT_MAX 进行检查需要包含limits.h 头文件。所指出的位操作 大卫出局是另一种选择。

【讨论】:

  • sizeof(char) 定义为 1。
【解决方案4】:
int i;
unsigned int j;

// store a value in i

j = i;

测试j是否包含负数:

if (0)
{
    printf("Negative!\n");
}

无符号整数从不包含负值。

如果i 的值为负数,那么当你将它分配给j 时,它会被转换为某个正值。如果你想知道i的值是否为负,你应该测试i,而不是j

if (i < 0) {
    puts("i is negative");
}
else {
    puts("i is not negative");
}
puts("j is not negative");

请注意,将j 的值转换回int 是不可靠的。将超过 INT_MAX 的值转换为类型 int 会产生实现定义的结果(或引发实现定义的信号)。您很可能会取回 i 的原始值,但为什么要麻烦呢?如果要测试i的值,请测试i的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 2018-06-29
    • 1970-01-01
    • 2020-04-24
    • 2011-06-26
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多