1. 程式人生 > >Java 基本型別 long 的一些使用陷阱

Java 基本型別 long 的一些使用陷阱

在java 中byte 佔用一個位元組,shot 佔用兩個位元組,char 使用的是unicode編碼,佔用兩個位元組,int 佔用四個位元組,long 佔用八個位元組

在使用long 的時候,有個地方一定要注意,java 虛擬機器預設把程式裡出現的常量數字當做是int型。因此,如果想定義一個大於2^31(2147483648)的整數時,

如果直接使用long var = 數字常量(數字常量大於等於2^31),結果達不到實際效果,實際上,此時的var 的值為溢位後的值。看幾個例子。

1. long var = 1<<31;System.out.println(var); 列印結果為 -2147483648,1<<32 實際上溢位了,成為了負數,因為java虛擬機器把1當成int型,然後對int型的1,左移31位,

導致結果溢位,至於為什麼是-2147483648 很簡單明瞭

2.long  var = 2147483648; System.out.println(var);  編譯不通過,JIT 編譯器直接識別出 2147483648 這個數字常量大於有符號整數所能表示的最大範圍的。

3.long var = 0x80000000; System.out.println(var);  列印結果為  -2147483648 ,原因和1 一樣的,java虛擬機器把0x80000000,當成了int型的數,因此結果溢位

4.long var = ((long)1)<<31; System.out.println(var);  列印結果為 2147483648 ,符合預期結果。例子4和例子1的區別在於在移位操作前,先把int 型的1轉換為了long型別。這樣後續進行的移位操作就是long型別的移位操作了,結果不會溢位。

java 虛擬機器的這個特點,使得我們不能用數字常量直接定義一個大於Integer.MAX_VALUE變數,這點很容易出錯。

相關推薦

Java 基本型別 long一些使用陷阱

在java 中byte 佔用一個位元組,shot 佔用兩個位元組,char 使用的是unicode編碼,佔用兩個位元組,int 佔用四個位元組,long 佔用八個位元組 在使用long 的時候,有個地方一定要注意,java 虛擬機器預設把程式裡出現的常量數字當做是int型。

java 基本型別long, float型別轉換

float > long 即float表示範圍比long大 先看一下它們能表示的範圍 public class EqualsTest1 { public void equals1() { long lx = 40; float fx = 40.1f; Syst

java基本型別(數值範圍):浮點的底層表示定義,float計算快一些

Java八種基本型別: 六種數字型別(四個整數型,兩個浮點型), 一種字元型別, 一種布林型。 具體如下 1、整數:包括int,short,byte,long 2、浮點型:float,d

java 基本型別和運算子

一.java的特性 java語言由JamesGosling和BillJoy 的指導下由Sun公司開發的。 java是編譯語言也是解釋語言   java原始碼----> 位元組碼--->java執行時直譯器執行 java指定所有基本資料型

Java基本型別及其包裝類

Java基本型別及其包裝類 1.java中的基本型別         java中一共提供了8中基本資料型別,分別有byte,short,int,long,float,double,boolean,char; . &

Java基本型別和包裝類(一)

Java基本型別和包裝類(一) java有8個基本型別,但是它們不具備面向物件的特性所以不能直接參與面向物件開發, 那麼在實際使用上會出現很多的不便為此java為8個基本型別提供了對應的包裝類, 以便於讓基本型別以物件形式存在並參與面向物件的開發中

Java基本型別轉換

  Java虛擬機器包括許多進行基本型別轉換工作的操作碼,這些執行轉換工作的操作碼後面沒有運算元,轉換的值從棧頂斷獲得。Java虛擬機器從棧頂端彈出一個值,對它進行轉換,然後再把轉換結果壓入棧。 int、long、float、double 型別之間的相互轉換,針對這四種類

java基本型別與引用型別

java基本型別與引用型別 一、基本資料型別 二、引用型別 三、基本型別與引用型別的區別 1.預設值 2.記憶體分配 3.自動裝箱、自動拆箱 4.自動裝箱、拆箱帶來的問題 1.程式的效能

Java基本型別陣列轉ArrayList

先來看原始碼 當我們呼叫Arrays.asList(array) 時,實際是執行了包可見的ArrayList的建構函式(注意通常這個建構函式對使用者是不可見的,所以不能通過List list = n

Java基本型別與引用型別 以及 Java記憶體知識整理

Java基本型別和引用型別是什麼?每種基本型別都佔多少位多少位元組?詳見下表 基本型別 整型 byte 1位元組 -27~27-1   -128~127 short 2位元組 -215~215-1  -32,768~32,767 (3萬多)

java基本型別陣列初始化

1.byte、short、int、long型別陣列,陣列元素預設初始化為0。 byte[] i= new byte[10]; //short[] i = new short[10]; //int[] i = new int[10];   System.out.println(i); //是一個記憶體地址  

java基本型別包裝類

一.基本型別包裝類概述 在實際程式使用中,程式介面上使用者輸入的資料都是以字串型別進行儲存的 8種基本型別對應的包裝類如下: 1.將字串轉成基本型別: 2.將基本數值轉成字串有3種方式: ①基本型別直接與””相連線即可;例如:34+"" ②呼叫String的valueOf方法;String

JAVA 基本型別陣列的初始化(原理篇)

本頁面更新日期: 2016年06月25日 前言 在之前的學習中, 我們已經會 初始化陣列了. 但是你真的瞭解其內部都發生了什麼嘛? 下面讓我們探究一下. 扒光陣列的華麗外衣, 嘿嘿.

JAVA基本型別和包裝類的裝箱與拆箱

JAVA的包裝類 Java語言是一個面向物件的語言,但是Java中的基本資料型別卻是不面向物件的,這在實際使用時存在很多的不便,為了解決這個不足,在設計類時為每個基本資料型別設計了一個對應的類進行代表,這樣八個和基本資料型別對應的類統稱為包裝類(Wrapper Class)

java基本型別基本型別包裝型比較時的自動拆箱和自動裝箱

java中,任何物件都繼承自Object,所以都有equals()方法。在基本型別中,兩個數值之間的比較==和equals()方法,比較的都是兩個運算元的地址,地址相同,則返回值為true。在物件中,不管是自己寫的物件還是java中已經有的物件,如果這個類物件複寫了繼承自O

java基本型別、陣列、集合對應的包裝類詳解

本文主要是整理了近期所閱書籍而成。 第一個,基本型別的包裝類: 基本資料型別:byte,int,       short, long, boolean,char,       float,double等 包裝型別     : Byte,Integer,Short,L

java基本型別過載

1. 過載 java允許在一個類中,多個方法擁有相同的名字,但在名字相同的同時,必須有不同的引數,這就是過載 2. 基本型別過載 基本型別能從一個較小的型別自動提升至一個較大的型別,此過程涉及過載時,可能會造成一些混淆。 3. 程式碼示例 public class

java基本型別與包裝型別

基本資料型別:byte,int,       short, long, boolean,char,       float,double等 包裝型別     : Byte,Integer,Short,Long,Boolean,Character,Float,Double等

Java基本型別字典表

主型別         大小           最小值             最大值                               封裝器型別           預設值boolean      1 位                           

Java基本型別

漢字是Unicode編碼的,而Unicode編碼佔兩個位元組,也就是16位,而char型別也是儲存兩個位元組,故可以儲存一個漢字。 變數就是申請記憶體來儲存值。也就是說,當建立變數的時候,需要在記憶體中申請空間。 記憶體管理系統根據變數的型別為變數分配儲存空間,分配的