【问题标题】:problem signed char c++问题签名char c++
【发布时间】:2011-06-11 14:31:48
【问题描述】:

这是代码:

int main()
{

 char c = 0x00;
 //c |= 0x0A;
 c |= 0xA0;

 while(c != 0x00)
 {
  cout << (c & 1) << endl;
  c = (c >> 1); 
 }
}

当我使用0X0A 而不是0xA0 时,为什么这段代码可以工作,因为数字 0xA0 太大而无法容纳有符号的字符,但为什么我不允许为 0xA0 设置位?

当我打印循环时它永远不会中断并且只打印循环?怎么会?

【问题讨论】:

  • 它打印一个,因为你告诉它 (c &amp; 1)。

标签: c++ char hex


【解决方案1】:

这是因为执行右移时的符号扩展。

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 编译器是已知情况)。

【讨论】:

  • (0xA0 &gt;&gt; 1) &lt;=&gt; 11010000 不一定正确 - 它是定义的实现。
  • 是的,我知道,但这主要取决于该值是有符号还是无符号。我不知道在执行右移时不执行符号扩展的编译器。
【解决方案2】:

当右移负数时,您的实现必须在最高有效位添加 1(运算符的行为是实现定义的,因此通常取决于可用的 CPU 指令)。

0xA0 = 1010 0000 binary

第一次采样 c &amp; 1 - 最低有效位 - 实际上是 0。然后...

c = (c >> 1)

...将其移至 1101 0000,然后移至 1110 1000, 1111 0111, 1111 1011, 1111 1101, 1111 1110, 1111 1111 - 然后稳定且不再变化。因此,您一直打印 1,并且永远不会满足 c == 0 的终止条件。

当我打印循环时它永远不会中断并且只打印循环?怎么会?

嗯,一开始它会打印几个 0,但您的屏幕可能会在一眨眼之间滚动过去,然后您只会看到 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2022-01-22
    • 2011-07-04
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多