随笔分类 -  x86

摘要:今天突然遇到一个奇怪的问题,代码如下/* main.c */#include int main (void){ int dat = 0xFFFFFFFF; while (dat) { printf ( "%x\n",dat); dat >>= 1; } return (0);}#gcc -g -Wall main.c #./aFFFFFFFFFFFFFFFF.................^C# 我一直以为 signed 和 unsigned 的区别在于编译器对待他们的态度,底层永远是补码,这样,0xFFFFFFFF,按我的设想,一定是32个循环完事,因为无论 阅读全文
posted @ 2013-10-17 17:42 moon_cat 阅读(295) 评论(0) 推荐(0)
摘要:例如 0xFFFF0000 倒转 0x0000FFFF开始的时候想到一个办法,是这样:/* 32 位机器 */static unsigned reverse (unsigned dat){ int i = 0,low,high; for (i = 0 ;i >i ; high = (dat & (1>(31-i) ; dat = (dat & ~((1>= 1; }while (dat);}这个就简单多了,没有用乘除,只用累加即可。。。。。。。。 阅读全文
posted @ 2013-10-17 16:53 moon_cat 阅读(195) 评论(0) 推荐(0)
摘要:unsigned 和 signed 之间的转化赋值非常容易被弄错,例如经典的 (-1)和 0xFFFFFFFF比较。如下: unsigned short i = -1; if (0xFFFFFFFF == i) { ..... ; /* this will not be executed forever ! */ }鉴于经常被弄错,我现在总结一下,转化规则,有几个情形:1.同位宽,同符号2.同位宽,不同符号,这个情况,就是几条mov dword [xxxx],xxxx 语句,所以操作的必然就是机器数,-1 即为 0xFFFFFFFF; 因此我们发现,不论是 : un... 阅读全文
posted @ 2013-10-12 01:11 moon_cat 阅读(1915) 评论(0) 推荐(0)
摘要:unsigned 和 signed 混合运算总是被问及,我这里总结一下。这里的几个情况:1.同等数据宽度,只要出现 unsigned ,皆以unsigned 运算。2. 同等符号前缀,自动转化为大位宽大数据范围处理,如 unsigned long long 和 unsigned int ,总以 unsigned long long 处理.3.不同数据宽度且不同数据符号前缀: unsigned short 和 int ,皆转化为 int 。 int a = -2; unsigned short = 1; a / b 等于 -2 ,因为以 int 计算; int a =... 阅读全文
posted @ 2013-10-11 23:10 moon_cat 阅读(1531) 评论(0) 推荐(1)