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 <stdio.h>
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int array[] = { 32,33,11,42,43,21 };
int main()
{
int d = -1;
if ( d <= 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 每天回家都会看到我老婆在装死





MD,本来想装做没看见的。。竟然拿Miku来逼我回复。。。
超萌啊 不过这首歌好像不是KAITO合成的哇
大哥是必须死的。
而且明显Miku的原版好听:sm11480547(最好成绩周刊第2哦~)
优酷的地址:http://v.youku.com/v_show/id_XMTk1MDk1OTgw.html
囧 MIKU的果然好萌啊