首页
社区
课程
招聘
[讨论]32为操作系统位运算是否是32位的,不能发生16位的位运算?
发表于: 2008-8-17 03:22 4437

[讨论]32为操作系统位运算是否是32位的,不能发生16位的位运算?

2008-8-17 03:22
4437
比如:

如果是32位的位运算,则:
char a = (0b01001111<<2)>>2 = 0b01001111;

如果是16位的位运算,则:
char a = (0b01001111<<2)>>2 = 0b00001111;
//(左移2位后超过16位发生截断,再右移2位回来就成了0b00001111)

现在想想貌似前者是对的,想求证一下,以求保险。

另外:
unsigned char与char在左移时是全部发生逻辑位移,还是前者逻辑,后者算数?

谢谢各位!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
2
LZ考虑的是逻辑位移时的情况?没记错该是算数位移,若移回来是依然不变的
        shl指令是逻辑左移指令:把???左移n位
        最后溢出的一位写入CF
        低位按照逻辑位移用0填充
        shl指令是逻辑右移指令:把???右移n位
        最后丢失的一位写入CF
        高位按照逻辑位移用0填充
        算数位移则copy丢失位补充当增长位.
再一个问题,char是二字节,也即8位bit。32位、16位对char类型没有影响罢,它最少得够表示ASCII,最多亦然

使用逻辑位移或算数位移的判断:算数位移是为有符号数设计的,对于uisigned数, 它是绝对不会使用算数位移的.除了unsigned,大部分编译器默认的是一直使用算数位移.这种问题也影响了程序的可移植性.
2008-8-17 09:02
0
雪    币: 257
活跃值: (56)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
谢谢XPoy,很详细。
再一个问题,char是二字节,也即8位bit。32位、16位对char类型没有影响罢,它最少得够表示ASCII,最多亦然

文章上写错了,应该是8位。
这个确实不影响,不过我开始以为char a = (0b01001111<<2)>>2 = 0b00001111;,因为我认为此时因为有char的存在,位操作是以8位为准的,但其实应该是全部转换成int先算完了再转换回来char,失算啊,呵呵。
不过这又出现了个问题,也就是char->int转换的是按照signed还是unsigned,int->char转换的是按照signed还是unsigned。
这个尚未知晓。
2008-8-17 13:20
0
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
4
转换后会按照后者来运算,不过这可能因为编译器不同吧?编译后的机器码若非主动修改就可看做固定的
若编译器有根据类型转换优化机器指令的则是按照后者
反之则前者
当然,强制类型转换大部分情况是前者了,除非编译器对强制类型转换做了处理...
2008-8-17 23:55
0
雪    币: 126
活跃值: (169)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
32位计算机可以做16位的运算.这个和操作系统关系不大.只要处理器支持就行了.
就像64位计算机一样可以做32位运算.
32位模式下的AX,BX,CX,DX等寄存器依然有效.
2008-8-18 08:58
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
一直向下兼容,16位,8位等等...
2008-8-18 16:15
0
游客
登录 | 注册 方可回帖
返回
//