从 char 到 int 的转换会做一些奇怪的事情

Conversion from char to int does something weird

本文关键字:char int 转换      更新时间:2023-10-16

我与粒子光子合作制作数字手表+闹钟。我正在使用TFT屏幕,并在其上绘制了一些数字,我可以使用连接到光子的一些按钮来增加和更改"数字索引" - 目的是设置预定闹钟的时间。下面的函数是我点击按钮时调用的函数,它的参数是屏幕上"光标"所在的"数字索引",我可以用我的按钮导航。然而,这工作正常,一直到9 - 我的屏幕开始显示 ASCII 笑脸和其他字母而不是数字。我尝试放置一个 if 语句,当变量 temp 高于 9 时,它设置为 0 - 这是我最终想要实现的目标。这不起作用,当它超过 9 时,它会继续显示 ASCII 字母。然后我决定尝试在单击按钮时将 temp 打印到控制台,但它打印的第一个字母是 49 而不是 0?什么??

我对 C/C++ 不太熟悉,但我确实有一种预感,在我增加 temp 之前,我从 char 数组 timeSet 进行转换是错误的。你们怎么看?

void replaceDigitFromIndex(int selectorIndex) {
tft.setTextSize(4);
tft.setTextColor(ST7735_RED);
tft.setCursor(4, 20);
tft.print(timeSet);
int temp = 0;
if(selectorIndex == 1) {
temp = (int) timeSet[0];
temp++;
timeSet[0] = (char) temp;
}
if(selectorIndex == 2) {
temp = (int) timeSet[1];
temp++;
timeSet[1] = (char) temp;
}
if(selectorIndex == 3) {
temp = (int) timeSet[3];
temp++;
timeSet[3] = (char) temp;
}
if(selectorIndex == 4) {
temp = (int) timeSet[4];
temp++;
timeSet[4] = (char) temp;
}
}

字符'0'-'9'是 ASCII 字符 48-57*。

如果你想添加一个并让它们循环,你可以这样做:

//conversion to int is implicit, no need for (int)
int temp = timeSet[i] - '0'; //Subtract char '0' to map to ints [0,9]
temp = (temp + 1) % 10; //loop around 10
timeSet[i] = temp + '0'; //Add back char '0' to map back to chars ['0', '9']

*至少对你来说(因为你已经告诉我们'1'输出 48,所以你必须使用 ASCII 或 ASCII 的某个超集,如 UTF-8),但不能保证每个编译器都会像这样。这和可读性是我在代码中- '0'的原因。数字字符始终是连续的。谢谢@Pete!

在 ASCII 中,只有单个字符的表示形式,特别是对于仅表示从 0(字符 48)到 9(字符 57)的数字。 当你超过9时,你会得到字符'9'+1,即':"。 当 int 超过 9 时放置一个 if 语句是正确的。 但请确保 if 在 int 上而不是字符上。