我已经尝试了以下两个代码:
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.- 我无法上传输出的图片,所以我被迫输入输出,我所得到的字符不会出现在标准键盘中。
答案 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。