我在 C 中有以下方法,它需要两个 16 位短整型:
- 将两个整数相加
- 如果设置了进位标志,则结果加 1
- 对最终结果中的所有位取反(NOT)
-
返回结果:
short __declspec(naked) getchecksum(short s1, short s2)
{
__asm
{
mov ax, word ptr [esp+4]
mov bx, word ptr [esp+8]
add ax, bx
jnc skip_add
add ax, 1
skip_add:
not ax
ret
}
}
我必须在内联汇编中编写此内容,因为我不知道有什么方法可以在不使用汇编器的情况下测试进位标志。有谁知道有什么方法可以做到这一点?
不(C 根本没有标志的概念)但这并不意味着您不能得到相同的结果。如果用32位整数做加法,第17位是进位。所以你可以这样写:
uint16_t getchecksum(uint16_t s1, uint16_t s2)
{
uint32_t u1 = s1, u2 = s2;
uint32_t sum = u1 + u2;
sum += sum >> 16;
return ~sum;
}
为了防止出现麻烦,我已将类型设为未签名。这在您的平台上可能没有必要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)