为什么我的ASCII整数值变为负数?

时间:2016-02-16 02:33:52

标签: c encryption ascii

我试图通过对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字符的整数值的负值。这导致解密失败。查看代码,因为我使用模运算,所以我无法获得负值。我在这里错过了一些简单的东西吗?

1 个答案:

答案 0 :(得分:1)

许多实现使用普通char的签名字符。如果您需要将字符设为无符号,则您需要使用unsigned char

例如,如果您的char值为100,并且您添加了50,那么您将获得150.如果CHAR_MAX值为127(典型值),那么您最终会得到一个实现定义值被分配回你的角色 - 最有可能回到-106。

此外,在C中,模数运算后负值仍为负值。例如:-50 % 256-50。因此,如果您的原始字符串的字符小于-50,则在添加50并使用模256后,最终会得到负值。