为什么c++中有符号字符和无符号字符的ASCII值不同

why does ascii value vary for signed and unsigned character in c++?

本文关键字:字符 ASCII 无符号 c++ 符号 为什么      更新时间:2023-10-16

我尝试了以下2个代码:

    int main()
{
int val=-125;
char code=val;
cout<<"t"<<code<<" "<<(int)code;
getch();
}

我得到的输出是a^ -125

第二个代码是:

    int main()
{
int val=-125;
unsigned char code=val;
cout<<"t"<<code<<" "<<(int)code;
getch();
}

我得到的输出是:a^ 131

在尝试这两个代码后,是否可以安全地得出结论,一个字符可以有2个ASCII值,或者我找到ASCII值的方法是有缺陷的?

注:-我无法上传我输出的图片,所以我被迫在标准键盘中没有出现我得到的字符的地方输入输出。

在这两个例子中'code'具有相同的位值。第一个位是1,因为它是一个负数。由于两个'代码'具有相同的值,因此输出字符是相同的(从数字->字符转换将数字视为无符号值)。

之后将字符转换回(有符号)整数。该转换尊重char的类型和符号。

->unsigned char -> int -> int always positive

->char -> int -> int与char具有相同的符号(因为第一个位是1,所以这里是负的)

c++中的无符号整数具有模2n行为,其中n为值位数。

这意味着如果你的char有8位,那么unsigned char有模256行为。

这种行为就好像把0到255的值放在一个表盘上。任何产生超过0-255除法的结果的操作都只是有效地进行了换行。就像钟面上有小时的算术

表示赋值-125得到的值范围是0 ~ 255,即-125 + 256 = 131。