gpt4 book ai didi

c - 为什么/=2 与 >>=1 对于有符号整数不同,并编译为不同的 asm?

转载 作者:行者123 更新时间:2023-12-03 20:05:56 25 4
gpt4 key购买 nike

unsigned int a=200;
//mov dword ptr [a],0C8h
a >>= 1;
//mov eax,dword ptr [a]
//shr eax,1
//mov dword ptr [a],eax
a /= 2;
//mov eax,dword ptr [a]
//shr eax,1
//mov dword ptr [a],eax
int b = -200;
//mov dword ptr [b],0FFFFFF38h
b /= 2;
//mov eax,dword ptr [b]
//cdq
//sub eax,edx
//sar eax,1
//mov dword ptr [b],eax
b >>= 1;
//mov eax,dword ptr [b]
//sar eax,1
//mov dword ptr [b],eax

我正在使用 msvc,//是该 C 语句的程序集。

为什么是signed int /=2不同于 >>=1 ?什么是 cdqsub正在做?他们有必要吗?

最佳答案

将负整数除以 2 与将其右移 1 不同。
例如

-7 / 2 = -3

有轮类:
11111001b >> 1 = 11111100b which is -4

因此编译器必须处理整数为负的情况

What are cdq and sub doing? Are they necessary?


cdq执行以下 EDX:EAX ← EAX 的符号扩展。

因此,如果 EAX 中的值为负,则 EDX 将获得 0xFFFFFFFF(即 -1),否则将为 0(由于 EAX 的符号扩展)。
sub eax, edx ; will either result in 'eax - 0' (if EAX is positive) or
; 'eax - (-1)' (if EAX is negative)

在上述示例的情况下,将 -7 规范化为 -7 - (-1) = -6然后 -6 >> 1 = -3 .

关于c - 为什么/=2 与 >>=1 对于有符号整数不同,并编译为不同的 asm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62246863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com