Chinaunix

标题: 32位数移位变64位问题 [打印本页]

作者: lknh17    时间: 2009-07-02 05:01
标题: 32位数移位变64位问题
程序如下,代码注释也很清楚了
          /*
         * All this magic is because you have to pass makecontext a
         * function that takes some number of word-sized variables,
         * and on 64-bit machines pointers are bigger than words.
         */
        z = (ulong)t;
        y = z;
        z >>= 16;        /* hide undefined 32-bit shift from 32-bit compilers */
        x = z>>16;
        makecontext(&t->context.uc, (void(*)())taskstart, 2, y, x)

(上面z是64位,x,y是32位,t是64位指针)
为什么不直接x=z>>32呢?而要分两步,难道和特殊的机器有关?



谢谢了
作者: aaaaa5aa    时间: 2009-07-02 06:52
标题: 回复 #1 lknh17 的帖子
此处是为了程序的兼容性所设计,为了让其适于更多的系统
作者: hellioncu    时间: 2009-07-02 10:26
关键是这句hide undefined 32-bit shift from 32-bit compilers吧,32位编译器执行 >> 32 的结果是未定义的,不过我印象中是32位整数移位32的结果是未知的
作者: lknh17    时间: 2009-07-02 22:21
原帖由 hellioncu 于 2009-7-2 10:26 发表
关键是这句hide undefined 32-bit shift from 32-bit compilers吧,32位编译器执行 >> 32 的结果是未定义的,不过我印象中是32位整数移位32的结果是未知的


可是程序是64移32位,不是32位整数移32的吧...   32位机器上,32位整数移32是无意义,但是这里是64位在移动啊?
我写了个程序试验下:
using namespace std;

int main()
{
  unsigned long long x,y;
  x=(unsigned long long)200000000*10000;
  unsigned int  m,n;
  n=x;
  m=x>>32;      //这里直接右移32位
  y=(((unsigned long long)m)<<32)+2840207360;
  cout<<x<<endl<<n<<endl<<m<<endl<<y;
}

输出正确.

是不是没必要拆分2步?
作者: hellioncu    时间: 2009-07-02 23:43
从汇编角度讲,32位的程序只会处理32位整数的移位,不能直接对64位的整数进行移位。一种编译器正确,不能保证别的也正确吧。我也只是猜测




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2