字符与整数运算

Character vs Integer Arithmetic

这与另一个问题有关,但我相信我已经解决了那个问题,现在遇到了这个问题。看来我可以在 uint8_t 上正确地进行算术运算,但不能在 unsigned char 上进行。我不确定为什么会这样,因为根据我的理解 unsigned char 应该等同于 uint8_t

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

/*

gcc -o ./rsacalc ./rsacalc.c
./rsacalc 1 2 3

should produce 00:00 but usually seems to produce 03:00

*/

int main(int argc, char **argv)
{
    unsigned char sg, sk, sm;
    uint8_t ng, nk, nm;
    if ( argc != 4 ) return 0;

    sg = argv[1][0];
    sk = argv[2][0];
    sm = argv[3][0];

    ng = atoi(argv[1]);
    nk = atoi(argv[2]);
    nm = atoi(argv[3]);

    printf("%.2X:%.2X\n",
        ((sg ^ sk) % sm),
        ((ng ^ nk) % nm)
    );
    return 0;
}

问题是这样的

sg = argv[1][0];
sk = argv[2][0];
sm = argv[3][0];

此处您分配的是 '1' (49)、'2' (50) 和 '3' (51) 的 ASCII codes。请注意 '1' != 1。你正在做算术 不同的价值观,当然会有不同的结果。这无关 与类型。

正确的版本应该是

sg = argv[1][0] - '0';
sk = argv[2][0] - '0';
sm = argv[3][0] - '0';