不含“ abs”或“ if”的ASCII表中2个字符之间的差的绝对值

时间:2018-11-25 17:58:50

标签: c getchar putchar

这是我的代码:

#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!

2 个答案:

答案 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);