问题签名char c++
Posted
技术标签:
【中文标题】问题签名char c++【英文标题】:problem signed 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 & 1
)。
【参考方案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 >> 1) <=> 11010000
不一定正确 - 它是定义的实现。
是的,我知道,但这主要取决于该值是有符号还是无符号。我不知道在执行右移时不执行符号扩展的编译器。【参考方案2】:
当右移负数时,您的实现必须在最高有效位添加 1(运算符的行为是实现定义的,因此通常取决于可用的 CPU 指令)。
0xA0 = 1010 0000 binary
第一次采样 c & 1
- 最低有效位 - 实际上是 0。然后...
c = (c >> 1)
...将其移至 1101 0000,然后移至 1110 1000, 1111 0111, 1111 1011, 1111 1101, 1111 1110, 1111 1111 - 然后稳定且不再变化。因此,您一直打印 1,并且永远不会满足 c == 0 的终止条件。
当我打印循环时它永远不会中断并且只打印循环?怎么会?
嗯,一开始它会打印几个 0,但您的屏幕可能会在一眨眼之间滚动过去,然后您只会看到 1。
【讨论】:
以上是关于问题签名char c++的主要内容,如果未能解决你的问题,请参考以下文章