| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 372 人关注过本帖
标题:关于一个位运算符的问题
只看楼主 加入收藏
nixk
Rank: 2
等 级:论坛游民
帖 子:32
专家分:12
注 册:2014-9-10
结帖率:83.33%
收藏
已结贴  问题点数:5 回复次数:6 
关于一个位运算符的问题
程序代码:
#include <stdio.h>

void
main(void)
{
    long unsigned int n = 3 << 64;
    printf("%lu\n",n);
}
这个是不是超出机器限制了 输出结果为0
求解原因
2014-09-25 17:05
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:2 
估计你的机器上的long类型是32位的,向左偏移64位已经超出了它的宽度,出现的结果是不可预料的

这种情况你的编译器没警告吗?

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-25 18:35
小相公谢谢
Rank: 1
等 级:新手上路
帖 子:2
专家分:2
注 册:2014-9-20
收藏
得分:2 
你写反了,你把64写前面,3写后面就对了
#include <stdio.h>

void
main(void)
{
    long unsigned int n = 64 << 3;
    printf("%lu\n",n);
}
2014-09-25 18:39
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:2 
简单说说:
sizeof(long unsigned) 如果结果是4的话,那移动64位肯定越界了
<< 这个移动后面是补零的,不会出现别的随机数字
2014-09-25 19:30
nixk
Rank: 2
等 级:论坛游民
帖 子:32
专家分:12
注 册:2014-9-10
收藏
得分:0 
回复 2 楼 wssy213
没有报错哦
2014-09-25 22:37
nixk
Rank: 2
等 级:论坛游民
帖 子:32
专家分:12
注 册:2014-9-10
收藏
得分:0 
回复 4 楼 erty1001
好像 long int  的size确实是4哦
2014-09-25 22:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:2 
未定义行为
3 << 64 的类型为 signed int,3的具符号二进制至少需要3bits,即你最多只能移动 [sizeof(signed int)*8 - 3] 位,否则就是未定义行为

移位操作Bitwise shift operators
2. 每个操作数都应当为整型
3. 每个操作数都执行整型提升,结果类型为“左操作数类型提升后的类型”。如果右操作数是“负值”或“值大于等于左操作数的宽度”,其行为未定义。
4. E1<<E2的结果是E1左移E2位;空出的位以0填充。
当 E1 为无符号类型时,结果等于“(E1*"2的E2次方")%"结果类型的最大值+1"”;
当 E1 为具符号类型时,如果 值非负 且 结果类型能表达(E1*"2的E2次方"),那么(E1*"2的E2次方")就是结果值;否则行为未定义
5. E1>>E2的结果是E1右移E2位。
当 E1 为无符号类型时,或E1虽然是具符号类型但值非负时,结果值是 E1/(2的E2次方) 的整数部分;
当 E1 为具符号类型,值为负时,结果值取决于 实现定义。
2014-09-26 09:45
快速回复:关于一个位运算符的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016219 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved