gpt4 book ai didi

带有负数的 Java Bitshift 错误?

转载 作者:行者123 更新时间:2023-11-28 06:20:42 27 4
gpt4 key购买 nike

http://www.fastcgi.com/devkit/doc/fcgi-spec.html在 3.4 节中:

 typedef struct {
unsigned char nameLengthB0; /* nameLengthB0 >> 7 == 0 */
unsigned char valueLengthB0; /* valueLengthB0 >> 7 == 0 */
unsigned char nameData[nameLength];
unsigned char valueData[valueLength];
} FCGI_NameValuePair11;

typedef struct {
unsigned char nameLengthB0; /* nameLengthB0 >> 7 == 0 */
unsigned char valueLengthB3; /* valueLengthB3 >> 7 == 1 */
unsigned char valueLengthB2;
unsigned char valueLengthB1;
unsigned char valueLengthB0;
unsigned char nameData[nameLength];
unsigned char valueData[valueLength
((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
} FCGI_NameValuePair14;

typedef struct {
unsigned char nameLengthB3; /* nameLengthB3 >> 7 == 1 */
unsigned char nameLengthB2;
unsigned char nameLengthB1;
unsigned char nameLengthB0;
unsigned char valueLengthB0; /* valueLengthB0 >> 7 == 0 */
unsigned char nameData[nameLength
((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
unsigned char valueData[valueLength];
} FCGI_NameValuePair41;

typedef struct {
unsigned char nameLengthB3; /* nameLengthB3 >> 7 == 1 */
unsigned char nameLengthB2;
unsigned char nameLengthB1;
unsigned char nameLengthB0;
unsigned char valueLengthB3; /* valueLengthB3 >> 7 == 1 */
unsigned char valueLengthB2;
unsigned char valueLengthB1;
unsigned char valueLengthB0;
unsigned char nameData[nameLength
((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
unsigned char valueData[valueLength
((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
} FCGI_NameValuePair44;

我正在用 Java 实现它,为了执行 valueLengthB3 >> 7 == 1 等部分,我只是将其设置为负数。这是行不通的。负数在 Java 中是如何工作的,如何在 Java 中执行此操作?

我当前的代码:

public void param(String name, String value) throws IOException {
if (fp) {
throw new IOException("Params are already finished!");
}
if (name.length() < 128) {
dpout.write(name.length());
}else {
dpout.writeInt(-name.length());
}
if (value.length() < 128) {
dpout.write(value.length());
}else {
dpout.writeInt(-value.length());
}
dpout.write(name.getBytes());
dpout.write(value.getBytes());
}

最佳答案

Java 使用非常常规的整数运算。相对于 C 和 C++ 的两个主要特性是

  1. Java 除了 char(16 位宽)之外没有无符号整数类型,并且
  2. Java 有单独的算术 (>>>) 和逻辑 (>>>) 右移运算符。前者通过用左操作数的最高有效位的拷贝填充结果的所需最高有效位来保留符号,而后者用零填充结果的最高有效位。

Java 的优势在于所有原始类型在所有平台上都具有众所周知的、一致的大小和符号,并且它的两个右移运算符对于所有有效操作数都具有明确定义的语义。相反,在 C 中,对负值执行右移的结果是实现定义的,所有 标准数据类型都具有实现定义的大小,并且一些类型 (char) 具有实现定义的签名。

但是,现在您已经发布了一些代码,看来这些都不是您的问题。我无法理解为什么您认为取负数会执行任何类型的移位,或者实际上,为什么您认为对于您尝试做的事情根本需要移位。

请特别注意,Java 使用二进制补码整数表示法(这也是迄今为止 C 编译器最常见​​的选择),因此取负数不仅仅修改符号位。相反,如果您只想设置 int 的符号位,那么您可以这样拼写

value.length() | 0x80000000

关于带有负数的 Java Bitshift 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29356822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com