int还是unsigned int

一切开始于今天偶然看到的一道C语言题目

int a = -1;
unsigned int b = 2;
那么a+b>a?为什么?a+b>b?为什么?

然后我认为是:
a 用二进制表示为 11111111 11111111 11111111 11111111
b 用二进制表示为 00000000 00000000 00000000 00000010 (转换为int)
加起来以后,溢出 00000000 00000000 00000000 00000001
于是有a < a+b < b
然后在VS2008里测试一下 悲剧了。。。结果是 a+b < a 且 a+b < b

上网找了一堆解释,又有个例子

#include &lt;stdio.h&gt;
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int array[] = { 32,33,11,42,43,21 };

int main()
{
int d = -1;

if ( d &lt;= TOTAL_ELEMENTS - 2 )
printf("d is less than TOTAL_ELEMENTS-2")  ;
else
printf("d is not less than TOTAL_ELEMENTS-2")  ;

return 0;
}

运行一下,输出的结果是 d is not less than TOTAL_ELEMENTS-2

好吧,真相应该可以猜到了

在C语言中 unsigned int 比 int 高一级,而我潜意识的以为Int比较高级了
然后运算的时候,int 会转化为unsigned int

网上的解释:
C中的整数升级: char, short int 或者int型位段,包括他们的有符号和无符号变型,以及枚举类型,可以使用在需要int 或 unsigned int 的表达式中。如果int能完整表示源类型的所有值,那么该源类型的值就被转换成int,否则转换成unsighed int。
sizeof()返回的是unsigned int, 当 d 与 TOTAL_ELEMENTS – 2 比较时会升级为unsigned int, 因为d是-1就被转成了一个非常大的正数
需将 if ( d <= TOTAL_ELEMENTS – 2 ) 改成 if ( d <= (int)TOTAL_ELEMENTS – 2 )

回到开始的题目
直接比较二进制的话 a+b 显然小于a 和 b 啦~

这么简单的问题能纠结这么久,其实是还有个问题的

如何用宏尽可能简单的求得一个数字是 Int 还是 unsigned int

不罗嗦了 真相就是

#define TYPE(c) (c -c - 1 > 0)

简单吧~

内容部分引用自 http://www.cnblogs.com/abccd/articles/227380.html

还有一条忠告~
建议: 在代码中尽量少使用无符号类型,特别不要因为有些年龄,人口等无负数的值,而使用无符号类型。
特别附上MIKU的同人MV 每天回家都会看到我老婆在装死

  1. Pnuts says:

    MD,本来想装做没看见的。。竟然拿Miku来逼我回复。。。

  1. There are no trackbacks for this post yet.

填写留言


无觅相关文章插件,快速提升流量