为什么ascii值在c ++中对有符号和无符号字符有所不同?

时间:2014-07-12 10:32:34

标签: c++

我已经尝试了以下两个代码:

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

我得到的输出是^ -125

第二个代码是:

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

我得到的输出是:a ^ 131

尝试这两个代码后,可以安全地断定一个字符可以有2个ASCII值,或者我找到ASCII值的方法有缺陷吗?

P.S.- 我无法上传输出的图片,所以我被迫输入输出,我所得到的字符不会出现在标准键盘中。

2 个答案:

答案 0 :(得分:0)

在两个示例中,代码&#39;具有相同的按位值。第一位是1,因为它是一个负数。由于两个&#39;代码&#39;具有相同的值,输出字符是相同的(从number-&gt;字符转换将数字视为无符号值)。

之后,您将角色转换回(签名)整数。此转换尊重您的类型和符号。

- &gt; unsigned char - &gt; int - &gt; int always positiv

- &gt; char - &gt; int - &gt; int与char具有相同的符号(因为第一位是1,它在这里是否为负)

答案 1 :(得分:-1)

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

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

这种行为就好像0到255的值放在了表盘上。任何产生超过0-255的结果的操作都会有效地包围。就像钟表上的小时算术一样。

表示分配值-125会产生0到255范围内的相应值,即-125 + 256 = 131。