当前位置: 首页 > 知识库问答 >
问题:

为什么按位和0xFF负有符号整数将导致正有符号整数?[重复]

楚良平
2023-03-14

我的目标是了解两者的互补性。

有符号整数中的10000111等于-121。但是,如果您使用十六进制的0xFF或十进制的11111111按位与它,它将等于135

在我看来,这不应该发生,因为顶部字节10000111与结果字节10000111相同

    10000111
AND 11111111
------------
    10000111 = 135.

我的预期结果是该值不应该改变,它等于< code>-121。

我的实际结果是值发生变化。

我的猜测是,0xFF是一个无符号位。因此,顶部字节的有符号位1和下部字节的无符号位1将导致无符号位1。但是......那不可能是对的。

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class WebSocketWorkerThreadTest {
  @Test
  void SignedToUnsignedInteger() {
    byte signed = (byte) 0b10000111;
    // If java uses unsigned integer, it should be 135. however, java uses signed integer. Therefore, the outputs will be -121
    // 10000111
    // ^
    // the sign bit. If it exists then the value will be negative.
    Assertions.assertEquals(-121, signed);
    // 10000111
    // 11111111
    // --------
    // 10000111
    int unsigned = signed & 0xFF;
    Assertions.assertEquals(135, unsigned);
  }
}

共有2个答案

卫乐童
2023-03-14
匿名用户

Java 将整数(长整型和字节型)存储在两者的补码中。参见维基百科/维基/两s_complement

在这个表示中,任何负数都以一串1位开始,因为值< code>10000...0000是最小的可表示值,值< code>1111...111是-1。因此,当您剪切前导1位时,您会将该数字完全上移至正范围,因为新数字不再以1位开头。

在您的情况下,您使用byte,但byte的值没有您期望的形式。它是一个整数,当

年嘉禧
2023-03-14

当您应用时,签名的被提升为int

不是< code>10000111

这里的MSB为零,因此为正。

如果您将其转换回一个字节,这只需要8个LSB,则该字节将再次为负。

 类似资料:
  • GCC和Clang似乎对有符号整数和无符号整数之间的加法有不同的解释,这取决于它们的大小。为什么会这样?所有编译器和平台上的转换是否一致? 举个例子: 结果: 在这两种情况下,我们得到了-1,但其中一个被解释为无符号整数和下溢。我本以为两者都会以同样的方式转化。 那么,为什么编译器会以如此不同的方式转换它们,这保证了一致性吗?我用G11.1.0和Clang12.0测试了这个。以及Arch Linu

  • 未定义行为的一个例子是在flow上的整数行为 有没有一个历史的或者(甚至更好!)造成这种差异的技术原因是什么?

  • 我正在尝试将文件导入Excel,但是当我尝试使用相关数据创建记录时,它会向我显示以下错误: 在此行中: 这是我用来导入的列表控制器和方法: 我的方法导入到列表控制器中: 这是我的“deta”控制器:

  • 问题内容: 假设我有这个号码。我如何将其称为无符号变量?像C一样 问题答案: 假设 : 您会想到2的补码表示法;和, 通过您 的意思是 32位无符号整数, 那么您只需将其添加为负值即可。 例如,将此应用于-1: 假设1表示您希望将-1视为一个1位的实字符串,而假设2表示您希望其中的32个。 但是,除了你,没人可以说你隐藏的假设是什么。例如,如果考虑到1的补码表示形式,则需要应用前缀运算符。Pyth

  • 在这个答复中, zwol提出了这样的主张: 将两个字节的数据从外部源转换为16位有符号整数的正确方法是使用以下帮助函数: 上述哪个函数是合适的取决于数组是否包含小端或大端表示。Endianness不是这里的问题,我想知道为什么zwol从转换为的值中减去。 为什么这是正确的方法? 转换为返回类型时如何避免实现定义的行为? 既然可以假设2的补码表示,那么这个更简单的强制转换将如何失败:

  • 我在尝试更改哈希值时遇到了一个奇怪的问题。我有以下设置: 当我执行此代码时,我得到:“TypeError:没有将符号隐式转换为整数”,尽管 item[:company_name] 的输出是预期的字符串。我做错了什么?