能力值:
(RANK:260 )
|
-
-
2 楼
什么是“左右逻辑”???
如果你指的是逻辑移位的话,C中的移位操作符 << 和 >> 就是执行逻辑移位的。
比如,unsigned bit_mask = ( 0x01 << 15 );
bit_mask的值是 0x8000。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢!书呆彭
那么右移位,编译结果同不同?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
逻辑移位:(unsigned)>> 和 (unsigned)<<
算术移位:(signed)>> 和 (signed)<<
int main(void)
{
int x = 0xabcd;
unsigned int y = 0xdcba;
x<<=2; //与 (signed int)x<<=2; 相同,因为变量本身是signed
(unsigned int)x<<=2;
x>>=2;
(unsigned int)x>>=2;
(signed int)y<<=2;
y<<=2;
(signed int)y>>=2;
y>>=2;
return x+y;
}
汇编结果:
_TEXT segment byte public 'CODE'
assume cs:_TEXT,ds:DGROUP
_main proc near
?debug C E80105312E63707012AD422B
;
; int main(void)
;
push bp
mov bp,sp
;
; {
; int x = 0xabcd;
;
mov dx,-21555
;
; unsigned int y = 0xdcba;
;
mov bx,-9030
;
;
; x<<=2;
;
shl dx,2
;
; (unsigned int)x<<=2;
;
shl dx,2
;
; x>>=2;
;
sar dx,2
;
; (unsigned int)x>>=2;
;
shr dx,2
;
;
; (signed)y<<=2;
;
shl bx,2
;
; y<<=2;
;
shl bx,2
;
; (signed)y>>=2;
;
sar bx,2
;
; y>>=2;
;
shr bx,2
;
;
; return x+y;
;
mov ax,dx
add ax,bx
;
; }
;
pop bp
ret
_main endp
?debug C E9
?debug C FA00000000
_TEXT ends
因为算术左移和逻辑左移的结果一样,所以都编译成逻辑的,而右移不同,编译结果也不同
|
|
|