为char分配负值

时间:2011-09-27 05:29:43

标签: c++ c

为什么以下代码打印“?” ? 如何将-1分配给unsigned char

char test;
unsigned char testu; //isn't it supposed to hold values in range 0 - 255?
test = -1;
testu = -1;
cout<<"TEST CHAR = "<<test<<endl;
cout<<"TESTU CHAR = "<<testu<<endl;

4 个答案:

答案 0 :(得分:11)

unsigned只会影响数字(char s的内部表示是数字,记住)的内部表示如何被解释。因此-1 1111 1111two's complement符号,当放入unsigned char时,将含义(对于相同的位表示)更改为255。

问号可能是您的字体/代码页没有将(扩展的)ASCII值255映射到它可以显示的字符的结果。

我认为<<不识别unsigned char和signed char,因为它将它们的值解释为ASCII码,而不是普通数字。

此外,depends on your compiler默认情况下char是签名还是无签名;实际上,规范声明有three different char types(普通,有符号和无符号)。

答案 1 :(得分:4)

为无符号变量指定负值时,结果是它包裹。在这种情况下,-1变为255。

答案 2 :(得分:3)

我不知道C或C ++,但我的直觉告诉我它正在包装-1到255并打印ÿ,但由于它不在前128个字符中,所以它会打印?而不是。只是一个猜测。

要对此进行测试,请尝试分配-191并查看是否打印A(如果我的数学已关闭则打印为B。)

答案 3 :(得分:0)

有符号/无符号是通过使用该数字的最高位来定义的。 您可以为其指定负整数。符号位将在签名的情况下解释(当您使用它执行算术时)。当你将它视为一个字符时,它只需要将最高位的位视为无符号字符,并且只产生超过127(十进制)的ASCII字符:

unsigned char c = -2;

相当于:

unsigned char c = 128;

当c被视为角色时。 -1是一个例外:它设置了所有8位,并被视为255 dec。