为什么以下代码打印“?” ?
如何将-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;
答案 0 :(得分:11)
unsigned
只会影响数字(char
s的内部表示是数字,记住)的内部表示如何被解释。因此-1
1111 1111
为two'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。