没有 "abs" 或 "if" 的 ASCII table 中 2 个字符之间差异的绝对值

absolute value of difference between 2 chars in ASCII table without "abs" or "if"

这是我的代码:

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

最简单的方法是使用 abs 函数。

printf("%d",abs(c) );

但是如果你不想使用它,你可以试试换行:

c = a - b;

至:

c = (a > b) ? (a-b) : (b - a);

无分支:(假设二进制补码整数表示)

#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 为正数时,

(c < 0) 给出 0
c = (c^-0) + 0 ~> c = c^0 ... $foo XOR 0 给出 $foo
c = c无事可做。

c 为负数时,(c < 0) 给出 1
c = (c^-1) + 1 ... -1 二进制补码中的所有位都已设置 (~0)
c = (c^(~0)) + 1 ... 二进制补码 XOR ~0 中的负数 c 给出 -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]