能力值:
( LV11,RANK:188 )
|
-
-
2 楼
LZ考虑的是逻辑位移时的情况?没记错该是算数位移,若移回来是依然不变的
shl指令是逻辑左移指令:把???左移n位
最后溢出的一位写入CF
低位按照逻辑位移用0填充
shl指令是逻辑右移指令:把???右移n位
最后丢失的一位写入CF
高位按照逻辑位移用0填充
算数位移则copy丢失位补充当增长位.
再一个问题,char是二字节,也即8位bit。32位、16位对char类型没有影响罢,它最少得够表示ASCII,最多亦然
使用逻辑位移或算数位移的判断:算数位移是为有符号数设计的,对于uisigned数, 它是绝对不会使用算数位移的.除了unsigned,大部分编译器默认的是一直使用算数位移.这种问题也影响了程序的可移植性.
|
能力值:
( 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。
这个尚未知晓。
|
能力值:
( LV11,RANK:188 )
|
-
-
4 楼
转换后会按照后者来运算,不过这可能因为编译器不同吧?编译后的机器码若非主动修改就可看做固定的
若编译器有根据类型转换优化机器指令的则是按照后者
反之则前者
当然,强制类型转换大部分情况是前者了,除非编译器对强制类型转换做了处理...
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
32位计算机可以做16位的运算.这个和操作系统关系不大.只要处理器支持就行了.
就像64位计算机一样可以做32位运算.
32位模式下的AX,BX,CX,DX等寄存器依然有效.
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
一直向下兼容,16位,8位等等...
|
|
|