【问题标题】:Shift right zero fill operator >>> in Java: porting to C++Java中的右移零填充运算符>>>:移植到C++
【发布时间】:2023-06-08 02:40:02
【问题描述】:

我正在将 java 代码移植到 c++,并且我有一些带 shift 的逻辑指令:

 ((byte) ((buffer >>> 8) & 0xFF));

如何用 C++ 编写相同的代码?

字节,在c++中不存在,我定义为:

typedef unsigned char byte;

【问题讨论】:

  • Java的byte对应的C++类型是signed char。 (至少在大多数典型机器上,CHAR_BIT == 8)。

标签: java c++ porting logical-operators


【解决方案1】:

对于无符号整数类型,>> 将填充零位,就像 Java 的 >>> 一样。

注意:对于带有负值的签名类型,结果是实现定义的,因此最好避免这种情况,而不是像 Java >> 那样依赖它填充。

【讨论】:

  • 我试过了,但是我有 buffer=258374 (buffer 是一个 const unsigned int).. 所以 ((byte) ((258374 >>> 8) & 0xFF));给我:ffffff1 而我正在期待 f1
  • @Velthune:为我工作:ideone.com/nJhehi。您的真实代码可能在某处使用签名类型。如果您对某些特定代码的行为有疑问,请发布一些演示该行为的代码。
  • @Velthune as >>> 不是 C++ 中的有效运算符,我很好奇 ((byte) ((258374 >>> 8) & 0xFF)); 甚至 编译,更不用说给你 @987654327 的结果了@.
  • @Velthune 如果byte 定义为unsigned char,并且您正在使用具有8 位字符的典型机器,那么您的表达式不可能有0xfffffff1 的值;该值根本无法在 unsigned char 中表示。
  • 好的,我忘记了部分代码中的“未签名”,我的错!