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

为什么我的ASCII整数值变为负值?,c,encryption,ascii,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] && enc

我正在尝试通过使用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字符的整数值经常会出现负值。这导致解密失败。看看代码,我应该没有办法得到负值,因为我使用的是模运算。我是不是遗漏了一些简单的东西?

许多实现使用有符号字符来表示纯
char
s。如果需要对字符进行无符号处理,则需要使用
无符号字符

例如,如果
char
值为100,加上50,则得到150。如果
CHAR\u MAX
的值是127(典型),那么您最终会得到一个实现定义的值,该值被分配回您的角色——很可能会换回-106


同样,在C中,一个负值在模运算后仍然是负值。例如:
-50%256
-50
。因此,如果原始字符串中的字符小于-50,那么在加上50并取模256后,将得到负值。

代码的其余部分在哪里?我在函数中看不到导致问题的任何内容。
stringToEncrypt
的原始声明及其在传递给函数之前的内容似乎是一个可能的源(当然,除非
stringToEncrypt
为空或不包含nul终止字符)。因为
char
是在系统上签名的?为什么有
%256
?ASCII只有128个代码单元(全部为0到127)。许多字符串加密算法实际上在字节数组上运行并返回字节数组,因为并不打算总是返回在任何字符编码中都有效的字符串。