这是代码:
int main()
{
char c = 0x00;
//c |= 0x0A;
c |= 0xA0;
while(c != 0x00)
{
cout << (c & 1) << endl;
c = (c >> 1);
}
}
当我使用 0X0A
而不是 0xA0
时,为什么这段代码有效,因为数字 0xA0 太大了,无法容纳signed char 但为什么不允许我设置 0xA0 的位?
当我打印循环时它永远不会中断并且只打印一个?怎么会?
最佳答案
是因为右移时的符号扩展。
0xA0 <=> 10100000 binary (and is a negative number because the MSB is set to 1)
(0xA0 >> 1) <=> 11010000
将 char c
替换为 unsigned char c
或在移位后屏蔽 MSB。
int main()
{
char c = 0x00;
//c |= 0x0A;
c |= 0xA0;
while(c != 0x00)
{
cout << (c & 1) << endl;
c = (c >> 1) & 0x7f;
}
}
请注意,char
通常是有符号的(范围 -128..127),但某些 c/C++ 编译器将 char
定义为 unsigned
( AIX xlC 编译器是已知案例)。
关于c++ - 问题签名字符 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4733000/