c++ - 问题签名字符 C++

标签 c++ char hex

这是代码:

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/

相关文章:

c++ - C++中如何改变数组的顺序

C++,STL。将带有 rgb 颜色的字符串转换为 3 个 int 值?

c - Control+问号的十六进制代码?

c++ - 按值传递的结构,在 C -> C++ 回调函数 (gcc 4.1) 期间损坏

c++ - 遇到宽字符后文件被截断

c++ - QToolButton 信号和槽

c - 在 C 中处理超过 127 的 char 值

c# - 将用户输入的数据转换为大写

java - 将值转换为二进制,然后翻转Java中的所有位

c++ - dynamic_cast 被引入 C++ 以破坏多态性?