1. 程式人生 > >Java程式設計:Integer的取值範圍(-2^31~2^31-1)分析

Java程式設計:Integer的取值範圍(-2^31~2^31-1)分析

在 Java 中 Integer 的最小值、最大值定義如下:

/**
 * A constant holding the minimum value an {@code int} can
 * have, -2<sup>31</sup>.
 */
@Native public static final int   MIN_VALUE = 0x80000000;

/**
 * A constant holding the maximum value an {@code int} can
 * have, 2<sup>31</sup>-1.
 */
@Native public
static final int MAX_VALUE = 0x7fffffff;

最小值為 -2^31,最大值為 2^31-1,為什麼呢?推導過程如下:

Integer 實際佔用的二進位制碼的位數

一個 Integer 型別佔 4 位元組,一個位元組佔 8 位二進位制碼,因此一個 Integer 總共佔 32 位二進位制碼。去除第一位的符號位,剩下 31 位來表示數值。

原碼、反碼、補碼

在計算機中,資料是由二進位制補碼進行儲存的,在 Java 程式碼中我們看到的 “0x80000000”、“0x7fffffff”都是補碼的形式,通過轉換為原碼獲取它們的真實值。

MIN_VALUE = 0x80000000
; //補碼 MAX_VALUE = 0x7fffffff; //補碼

轉換公式:

  1. 當原碼為正數的時候,正數的原碼、反碼、補碼都相同。

正數:1
原碼:0000 0000 0000 0000 0000 0000 0000 0001
反碼:0000 0000 0000 0000 0000 0000 0000 0001
補碼:0000 0000 0000 0000 0000 0000 0000 0001

  1. 當原碼為負數的時候,反碼為去除符號位按位取反,補碼為去除符號位按位取反再加1。

負數:-1
原碼:1000 0000 0000 0000 0000 0000 0000 0001
反碼:1111 1111 1111 1111 1111 1111 1111 1110
補碼:1111 1111 1111 1111 1111 1111 1111 1111

因此在程式中,我們定義 16 進位制整形數時, 0x00000001

表示 1,0xFFFFFFFF表示 -1。

最大值為什麼是 2^31-1,不是 2^31

原碼:0111 1111 1111 1111 1111 1111 1111 1111
反碼:0111 1111 1111 1111 1111 1111 1111 1111
補碼:0111 1111 1111 1111 1111 1111 1111 1111

計算機中可表示的整數最大值的補碼為“0111 1111 1111 1111 1111 1111 1111 1111”,正數的補碼與原碼一致,原碼也為“0111 1111 1111 1111 1111 1111 1111 1111”,轉換為十進位制數為 2^31-1。

最小值為什麼是 -2^31,而不是 -(2^31-1)

我們依次推算負數值,如下:

原碼:1000 0000 0000 0000 0000 0000 0000 0001 -1
反碼:1000 0000 0000 0000 0000 0000 0000 0000
補碼:1111 1111 1111 1111 1111 1111 1111 1111

原碼:1000 0000 0000 0000 0000 0000 0000 0010 -2
反碼:1000 0000 0000 0000 0000 0000 0000 0001
補碼:1111 1111 1111 1111 1111 1111 1111 1110

原碼:1111 1111 1111 1111 1111 1111 1111 1111 -2^31 + 1
反碼:1111 1111 1111 1111 1111 1111 1111 1110
補碼:1000 0000 0000 0000 0000 0000 0000 0001

原碼:1000 0000 0000 0000 0000 0000 0000 0000 -0 約定為 -2^31
反碼:1111 1111 1111 1111 1111 1111 1111 1111
補碼:1000 0000 0000 0000 0000 0000 0000 0000

由此可以推算,Integer 的最小值為 -2^31。

相關推薦

Java程式設計Integer範圍-2^31~2^31-1分析

在 Java 中 Integer 的最小值、最大值定義如下: /** * A constant holding the minimum value an {@code int} can * have, -2<sup>31</sup&g

談談gnuplot座標範圍及刻度

http://qbk378.lofter.com/post/b28f6_14f062 我們從上一講結束時的影象開始: gnuplot> set samples 500 gnuplot> set xlabel "X" gnuplot> set ylabel "Y" gnupl

【原創】給定隨機數的範圍最小、最大,且要求多次取得的隨機數最後的結果有一個固定的平均值

給定隨機數的取值範圍(最小值、最大值),且要求多次取得的隨機數最後的結果有一個固定的平均值。 演算法如下: /****** * author ztg 281099678 2018-12-06 * @param $min float 範圍最小值 * @param $max

java資料型別,範圍,引用型別解析

    與javascript不同,Java是強型別語言,在定義變數前需要宣告資料型別。主要分兩種資料型別:基本資料型別和引用資料型別。   1、基本資料型別分析:   基本資料型別

c語言==字元陣列與字串,char的範圍1

求char型別陣列的strlen長度 昨天老師給了一道題目 #include <stdio.h> #include "string.h" int main() { int i; char a[1000]; fo

Java中float的範圍

規格化表示       java中的浮點數採用的事IEEE Standard 754 Floating Point Numbers標準,該標準的規範可以參考http://blog.csdn.net/treeroot/articles/94752.aspx.      float佔用4個位元組,和int是一樣,

整形資料範圍int、long、long long

unsigned int 0~4294967295 int 2147483648~2147483647 unsigned long 0~4294967295 long 214748

Java基本資料型別範圍,為什麼String 不是基本資料型別,char的範圍為什麼沒有負數

一、在JAVA中一共有八種基本資料型別,他們分別是 byte、short、int、long、float、double、char、boolean 整型 其中byte、short、int、long都是表示整數的,只不過他們的取值範圍不一樣 byte的取

Java中float/double範圍與精度

Java浮點數 浮點數結構   要說清楚Java浮點數的取值範圍與其精度,必須先了解浮點數的表示方法,浮點數的結構組成,之所以會有這種所謂的結構,是因為機器只認識01,你想表示小數,你要機器認識小數點這個東西,必須採用某種方法,比如,簡單點的,float

Java中float的範圍為什麼是那麼大?

float佔用4個位元組,和int是一樣,也就是32bit.       第1個bit表示符號,0表示正數,1表示負數,這個很好理解,不用多管.       第2-9個bit表示指數,一共8為(可以表示0-255),這裡的底數是2,為了同時表示正數和負數,這裡要減去127的

各種資料型別的範圍自查

       在寫程式的過程中我們有時候會處理一些極大地資料,這時候就會出現一些困惑各種資料型別的大小,宣告的時候讓自己很謹慎, 於是碰到較大的數值就直接long型別的的變數就聲明瞭,在C函式庫Limits中包含著對於所用編譯器中各個資料型別的取值範圍。下面是程式程式碼。/

C++各資料型別範圍備忘--32位作業系統

各資料型別取值範圍 bool型為布林型,佔1個位元組,取值0或1。 BOOL型為int型,一般認為佔4個位元組,取值TRUE/FALSE/ERROR。 sbyte型為有符號8位整數,佔1個位元組,取值範圍在128~127之間。 bytet型為無符號16位

Java 中 float 的範圍

.    float佔用4個位元組,和int是一樣,也就是32bit.    第1個bit表示符號,0表示正數,1表示負數,這個很好理解,不用多管.    第2-9個bit表示指數,一共8位(可以表示0-255),這裡的底數是2,為了同時表示正數和負數,這裡要減去127的偏移量.這樣的話範圍就是(-127到1

java中為什麽byte的範圍是-128到+127

進制數 符號位 為什麽 絕對值 www .html tar 同學 自己 概念:java中用補碼表示二進制數,補碼的最高位是符號位,最高位為“0”表示正數,最高位為“1”表示負數。正數補碼為其本身;負數補碼為其絕對值各位取反加1

JAVA基本類型大小與範圍?

false 特殊 數據類型 字節 true ima 指令 它的 ges 布爾類型boolean比較特殊,盡管Java虛擬機定義了boolean類型,但虛擬機對boolean類型的支持是有限的,沒有為boolean值單獨設計JVM指令。操作布爾值的表達式在編譯之後,它使用的

Java byte 類型的範圍是-128~127

com 基本數據類型 single static 數據 數據類型 blank tle -128 為什麽Java byte 類型的取值範圍是-128~127 : http://blog.163.com/[email protected]/blog/static/47

Java數據類型及對應範圍

小數 日常 java 方法 而且 div 滿足 archive 大寫 Java數據類型及對應取值範圍 在Java中,數據類型分為兩大種:基本數據類型(值類型)和包裝類型(引用數據類型)。基本數據類型不是對象,不能調用toString()、hashCode()、getCl

【原始碼追蹤】SparkStreaming 中用 Direct 方式每次從 Kafka 拉多少條資料offset範圍

我們知道 SparkStreaming 用 Direct 的方式拉取 Kafka 資料時,是根據 kafka 中的 fromOffsets 和 untilOffsets 來進行獲取資料的,而 fromOffsets 一般都是需要我們自己管理的,而每批次的 untilOffsets 是由

SQL 用於各種資料庫的資料型別轉載 sqlserver 資料型別 範圍 長度

SQL 用於各種資料庫的資料型別 來源 http://www.runoob.com/sql/sql-datatypes.html    面向資料庫程式設計中,資料型別的取值範圍、長度,可能是需要經常檢視的資料。 Microsoft Access、MySQL 和 SQL S

Java程式設計刪除 List 元素的三種正確方法面試與開發必備

刪除 List 中的元素會產生兩個問題: 刪除元素後 List 的元素數量會發生變化; 對 List 進行刪除操作可能會產生併發問題; 我們通過程式碼示例演示正確的刪除邏輯 package com.ips.list; import java.util.ArrayList; import jav