免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7705 | 回复: 4

[C] 32位数移位变64位问题 [复制链接]

论坛徽章:
0
发表于 2009-07-02 05:01 |显示全部楼层
程序如下,代码注释也很清楚了
          /*
         * 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呢?而要分两步,难道和特殊的机器有关?



谢谢了

论坛徽章:
0
发表于 2009-07-02 06:52 |显示全部楼层

回复 #1 lknh17 的帖子

此处是为了程序的兼容性所设计,为了让其适于更多的系统

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2009-07-02 10:26 |显示全部楼层
关键是这句hide undefined 32-bit shift from 32-bit compilers吧,32位编译器执行 >> 32 的结果是未定义的,不过我印象中是32位整数移位32的结果是未知的

论坛徽章:
0
发表于 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步?

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2009-07-02 23:43 |显示全部楼层
从汇编角度讲,32位的程序只会处理32位整数的移位,不能直接对64位的整数进行移位。一种编译器正确,不能保证别的也正确吧。我也只是猜测
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP