是否可以用暂时大于127的ASCII码计算?

Is it possible to calculate with ASCII numbers that are temporarily bigger than 127?

首先,我是编码的新手,我曾思考过这个问题,并尝试 google 它。 我已经有一个解决方法,我只是想知道是否可以通过其他方式实现。 我正在上cs50课程,我应该写一个加密函数。

我的问题是,我的 char 暂时大于 127,然后被截断。 那么在我保存之前是否可以暂时用某个字符进行计算 进入内存地址并截断它?

我认为应该是问题的部分:

for
(int i = 0; i < strlen(ui); i++)
{
    if
    (isupper(ui[i]))
        {
            ui[i] += key;
            if
            (ui[i] > 90)
            {
                ui[i] -= 26;
            }
        }
    if
    (islower(ui[i]))
        {   
            ui[i] += key;
            if
            (ui[i] > 122)
            {
                ui[i] -= 26;
            }
        }

它会被截断,例如如果输入 z 时密钥变得大于 6。

所以我能不能以某种方式写它,26 在进入存储之前被减去或者(我认为 atm)不可能,因为一旦它变得大于 127,即使它在一行中,它被截断了吗?

解决方法(我想到了现在写): 我会先减去 96,这样我就可以用 1 到 27 之间的数字进行计算,然后再加上它。

提前感谢您的建议。

评论中提到了一个可能的溢出错误,但是,代码中可能还有另一个错误,也许,我不知道你的算法应该是什么。

考虑 ui[i] 是 'Z' (90 ASCII) 和键 ':' (58 ASCII)。 'Z' 是大写的,所以第一个 if 语句的主体被执行,结果 ui[] 是 90 + 58 - 26 = 122 现在是 'z', N.B.小写。

现在 z 是小写的,所以第二个 if 的主体也会执行,导致 ui[] 现在是 122 + 58 - 26 = 154。这在 ASCII 之外范围所以你在那里溢出。

另一个例子是 ui[] = 'A' 和键 70。第一个 ifui[] 更改为 65 + 70 - 26 = 109 即 'm'。这也将触发第二个 if 语句,再次导致溢出。

我怀疑两个 if 主体是否应该以相同的值执行。如果不是,那么您需要在第二个 if.

之前添加一个 else
}
else if (islower(ui[i])) {
    ...

My problem is, that my char gets temporarily bigger then 127 and then gets truncated. So is it nevertheless possible to calculate with a certain char temporarily before I save it it into a memory address and truncate it?

是的,这是可能的,您不需要做任何特别的事情来实现它。在 C 表达式中,所有比 int 窄的整数类型的算术操作数都被转换为 int 或更宽的整数类型,并在更宽的类型中执行计算,产生该类型的结果。然后在必要时再次缩小以分配给更窄类型的对象。

但是请注意,

  1. 如果初始值无法在目标类型中表示,则向有符号整数类型的缩小转换具有实现定义的行为。这可能包括引发一个实现定义的信号。假设最重要的字节包含非零值时将被切掉是不安全的。

  2. 您所描述的并不是所提供代码的实际作用。特别是,我带你去讲这个:

         ui[i] += key;

在这种情况下计算 ui[i] + key 不是问题,但是在将结果写入内存之前没有特别的延迟。这就是 += 的赋值部分所做的。

你最好完全避免这种情况。例如,

if (islower((unsigned char) ui[i])) {
    ui[i] = (((ui[i] - 'a') + key) % 26) + 'a';
}

但是,请注意,那(和你的原作)假定连续块的小写字母的数值。这通常是正确的,但并非普遍如此。