是否可以用暂时大于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。第一个 if
将 ui[]
更改为 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
或更宽的整数类型,并在更宽的类型中执行计算,产生该类型的结果。然后在必要时再次缩小以分配给更窄类型的对象。
但是请注意,
如果初始值无法在目标类型中表示,则向有符号整数类型的缩小转换具有实现定义的行为。这可能包括引发一个实现定义的信号。假设最重要的字节包含非零值时将被切掉是不安全的。
您所描述的并不是所提供代码的实际作用。特别是,我带你去讲这个:
ui[i] += key;
在这种情况下计算 ui[i] + key
不是问题,但是在将结果写入内存之前没有特别的延迟。这就是 +=
的赋值部分所做的。
你最好完全避免这种情况。例如,
if (islower((unsigned char) ui[i])) {
ui[i] = (((ui[i] - 'a') + key) % 26) + 'a';
}
但是,请注意,那(和你的原作)假定连续块的小写字母的数值。这通常是正确的,但并非普遍如此。
首先,我是编码的新手,我曾思考过这个问题,并尝试 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。第一个 if
将 ui[]
更改为 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
或更宽的整数类型,并在更宽的类型中执行计算,产生该类型的结果。然后在必要时再次缩小以分配给更窄类型的对象。
但是请注意,
如果初始值无法在目标类型中表示,则向有符号整数类型的缩小转换具有实现定义的行为。这可能包括引发一个实现定义的信号。假设最重要的字节包含非零值时将被切掉是不安全的。
您所描述的并不是所提供代码的实际作用。特别是,我带你去讲这个:
ui[i] += key;
在这种情况下计算 ui[i] + key
不是问题,但是在将结果写入内存之前没有特别的延迟。这就是 +=
的赋值部分所做的。
你最好完全避免这种情况。例如,
if (islower((unsigned char) ui[i])) {
ui[i] = (((ui[i] - 'a') + key) % 26) + 'a';
}
但是,请注意,那(和你的原作)假定连续块的小写字母的数值。这通常是正确的,但并非普遍如此。