C unsigned int x = 1;小于int y = -1;

时间:2017-06-07 15:43:56

标签: c

我知道签名的unsigened等的差异 但我不明白以下代码:

unsigned int x = 1;
int y = -1;
    if(y < x)
        printf("of course it is");
    else
        printf("strange stuff");
无论使用哪种表示,

1应该是大于-1的数字。因为“奇怪的东西”将显示在控制台上。

2 个答案:

答案 0 :(得分:2)

以位为单位签名1(以字节为单位):00000001

无符号1位:00000001

以位为单位签名-1:10000001(或1 1111111,只是详细信息)

无符号-1位:无有效表示(10000001为129)

如果你想安全地比较有符号和无符号变量,那么你有两种方法:

1)记录帐号并手动比较(例如isSignedLess = (signed < 0) || ((unsigned <= max_signed) && (signed < unsigned))

2)将两者都投射到更大的烧焦(即签名长长)并且比较它们(签名长long可以存储签名/未签名int的所有diapason

正如你在评论中看到的那样,两种方式都有点棘手。只要不在任何地方,请不要签名和签名。在99%的情况下,这是可能的。在最后1%的情况下,你真的需要知道你在做什么(例如经常不得不使用带向量的带符号索引,但是大小() - 无符号,所以我问自己一百次&#34;这个向量是否可以达到MAX_INT?我要做更复杂的代码,或者它可以完成这项任务吗?&#34;)。

答案 1 :(得分:1)

您正在将unsigned int与signed int进行比较。你不应该这样做。 C通过将其中一个转换为另一个的类型来解决此问题。在这种情况下,它可能将y转换为unsigned int,使其为正,因此x应与y相同。

你可以使它们都是int,或者如果真的有必要,你可以在比较时将unsigned int转换为int。

if(y<(int)x)