簡體   English   中英

在java中將負int賦給long

[英]Assign negative int to long in java

我有2個整數值存儲在bytebuffer中,采用little-endian格式。 這些整數實際上是32位的長整數。 我將它們存儲為類的成員變量, loBitshiBits

這就是我做的:

long loBits = buffer.getInt(offset);
long hiBits = buffer.getInt(offset + Integer.BYTES);

我想知道為什么直接將signed int分配給long是錯誤的。 我知道發生了什么,但真的很感激解釋。

我從緩沖區讀取的int是簽名的(因為Java)。 如果它是負數,那么直接將其分配給long值(或者將其轉換為(long) )會將(long)所有高階位更改為有符號位值。

例如,對於int的十六進制表示, -16841684809b9da0e0 如果我將此int分配給long,則所有更高階32位將變為F

int negativeIntValue = -1684168480;
long val1 = negativeIntValue;
long val2 = (long) negativeIntValue;

十六進制表示:

negativeIntValue is 0x9b9da0e0
val1 is 0xffffffff9b9da0e0
val2 is 0xffffffff9b9da0e0

但是,如果我使用0x00000000FFFFFFFFL屏蔽negativeIntValue ,我得到一個long,它具有與negativeIntValue相同的十六進制表示和一個正長值2610798816

所以我的問題是:

  • 我的理解是否正確?
  • 為什么會這樣?

是的,您的理解是正確的(至少如果我理解您的理解正確)。

發生這種情況的原因是(大多數)計算機使用2的補碼來存儲有符號值。 因此,當將較小的數據類型分配給較大的數據類型時,該值是符號擴展的,這意味着數據類型的多余部分將填充0或1位,具體取決於原始值是正還是負。

Java中的>>>>>運算符之間的區別也是相關的。 第一個執行符號擴展(保持負值為負)第二個不執行(移動負值使其為正)。

原因是負值存儲為二進制補碼

為什么我們使用兩個補碼?

固定寬度編號系統中,如果從0減去1 ,會發生什么?

0000b - 0001b -> 1111b

什么是下一個較小的數字為0 它是-1

因此,我們將所有位設置的二進制數(對於有符號數據類型)設置為-1

最大的優點是當從正數轉為負數時,CPU不需要執行任何特殊操作。 它處理5 - 33 - 5相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM