我试图通过对C中ASCII字符的操作来完成一种非常基本的加密和解密形式。我有以下代码:

char* myEncrypt(char* stringToEncrypt)
{
    char *encryptedString = malloc(256);
    strcpy(encryptedString, stringToEncrypt);

    int publicKey = 50;

    for (int i = 0; encryptedString[i] && encryptedString[i] != '\n'; ++i)
            encryptedString[i] = (encryptedString[i] + publicKey) % 256;

    return encryptedString;
}

我的问题是,当我运行这段代码时,我经常会得到赋给encryptedString[I]的ASCII字符整数值的负值。这导致解密失败。看看代码,我应该没有办法得到负值,因为我使用的是模运算。我是不是遗漏了一些简单的东西?

最佳答案

许多实现使用带符号的字符来表示普通的chars。如果需要这些字符不带符号,则需要使用unsigned char
例如,如果char值为100,并且加50,则得到150。如果CHAR_MAX值是127(典型值),那么最终会将一个实现定义的值分配回您的角色——最有可能是-106。
另外,在C语言中,一个负值在模运算之后仍然是负值。例如:-50 % 256-50。因此,如果原始字符串的字符数小于-50,则在添加50并取256模后,最终会出现负值。

关于c - 为什么我的ASCII整数值变为负数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35422663/

10-12 01:30