问题签名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 &amp; 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 &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。

【讨论】:

以上是关于问题签名char c++的主要内容,如果未能解决你的问题,请参考以下文章

需要连接到 C++ DLL

C++0x 中 char 和 Unicode 的签名

为啥处理字节的 Windows API 调用(例如“recv”)使用默认签名的 char*?

C++:char* 与 char(*)[]

为啥将字符串作为文件名而不是 char* 传递时出现错误?

kucoin API 上的 C++ 签名消息