这是我的代码:
#include <stdio.h>
void main() {
char a, b;
char c;
printf("enter 2 chars: ");
a = getchar();
b = getchar();
c = a - b;
printf("%d",c );
}
我正在尝试查找两个字符之间的绝对值,例如'A'&'a'=> 32 'a'&'A'=> 32 我的代码显示否定答案,如果不使用abs函数该怎么办,或者尝试了以下操作:
printf("%u",c );
但是它给我4294967264。有什么简单方法吗?它应该使用getchar和putchar!
答案 0 :(得分:4)
无分支:(假设二进制补码表示)
#include <stdio.h>
int main(void)
{
printf("Enter 2 chars: ");
char a = getchar();
char b = getchar();
char c = a - b;
c = (c^-(c < 0)) + (c < 0);
printf("%d\n", c);
}
分成几部分:
(c < 0)
在0
为正数时给出c
:
c = (c^-0) + 0
〜> c = c^0
... $ foo XOR 0给出$ foo
c = c
无关。
(c < 0)
为负时,1
给出c
:
c = (c^-1) + 1
... -1
以二进制补码的形式设置的所有位(~0
)
c = (c^(~0)) + 1
...补数XOR c
中的负数~0
得到-c - 1
c = -c - 1 + 1
〜> c = -c
gcc 8.3 -O3:(cl v15.9.0-pre.3.0产生等效的程序集)
mov edx, edi ; edx = c
shr edx, 31 ; right shift, keep only the sign bit (c < 0) [sign]
mov eax, edx ; eax = [sign]
neg eax ; eax = -[sign]
xor eax, edi ; eax = -[sign] xor c
add eax, edx ; eax += [sign]
答案 1 :(得分:0)
最简单的方法是使用abs函数。
printf("%d",abs(c) );
但是如果您不想使用它,可以尝试更改以下行:
c = a - b;
收件人:
c = (a > b) ? (a-b) : (b - a);