c - 字符类型隐式减法在 C 中不起作用
问题描述
#include <stdio.h>
char decryptFun(int shift, char pt_letter);
int mod(int x, int y);
int main() {
char f = 'f';
char r = 'r';
char y = 'y';
int encryptKey = 3;
int test = 'f' - 'a';
printf("%d", test);
printf("%c", decryptFun(encryptKey, f));
printf("%c", decryptFun(encryptKey, r));
printf("%c", decryptFun(encryptKey, y));
return 0;
}
int mod(int x, int y) {
while (x < 0) {
x += y;
}
return x % y;
}
char decryptFun(int shift, char pt_letter) {
int letterPosition = (int) pt_letter - 'a';
int rawDecryptedLetter = mod((letterPosition + 3), 26);
char decryptedLetter = (char)rawDecryptedLetter;
return decryptedLetter;
}
我正在做一项学校作业,其中要求我将字母表中的字母从 0(“a”)到 25(“z”)编入索引。我正在尝试通过执行减法将字母转换为这种格式。前任。int test = 'f' - 'a'。但是,在调试中,我看到该变量“test”的存储值是一个荒谬的数字。应该是它们的ascii索引之差(102 - 97 = 5),变量显示它的值为-858993460。在调试中,我可以看到“f”和“a”都有正确的 ascii 值 102 和 97。为什么这个减法不起作用?
解决方案
正如@Craig Estey 推荐的那样使用unsigned char
decryptFun
可以简化为return 'a' + (pt_letter - 'a' + shift) % 26; }
#include <stdio.h>
unsigned char decryptFun(unsigned int shift, unsigned char pt_letter);
int main() {
char f = 'f';
char r = 'r';
char y = 'y';
unsigned int encryptKey = 3;
int test = 'f' - 'a';
printf("%d\n", test);
printf("%c\n", decryptFun(encryptKey, f));
printf("%c\n", decryptFun(encryptKey, r));
printf("%c\n", decryptFun(encryptKey, y));
return 0;
}
unsigned char decryptFun(unsigned int shift, unsigned char pt_letter) {
return 'a' + (pt_letter - 'a' + shift) % 26;
}
推荐阅读
- eiffel - Eiffel: How do I compare the type of an object to a given type?
- php - php validation to check text field is not working
- java - 在android中将String转换为Integer时出错
- java - 同步任务的正确方法,而不是一直锁定对象?
- android - 调整回收站视图中的项目 + 方向更改
- javascript - 使用 Javascript 动态设置“selected”属性
- java - 如何在java中的rest url中传递从和到日期的列表
- android - Android 应用和 Xamarin.Forms 中的启动器图标
- websphere-liberty - 自由 18.0.0.3 中的 JPA2 使用 MySQL 数据库
- git - 默认为 git push