1. 程式人生 > >java八種基本資料型別之byte

java八種基本資料型別之byte

首先,來兩個例子:
例子(1)

byte a = 127;
a = a + 1;
System.out.println(a);

例子(2)

int b = 456;
System.out.println((byte)b);

猜一下例子(1)和例子(2)都會輸出什麼結果?例子(1)會輸出128,例子(2)會輸出456?那就都錯了,其例項子(1)這樣寫會報錯,例子(2)輸出的結果是-56
分析一下:java中定義的byte是一個基本資料型別,它的取值被定義為-128~127,byte是一個位元組,有八位帶符號的二進位制陣列成的(即8個0或1),那麼為什麼byte的取值範圍是-128~127呢?這就需要我們複習一下計算機的基礎理論了。

上面說byte是由帶符號位的八個二進位制陣列成,即第一位為符號位,0代表正數,1代表負數,0000 0001代表1,所以正數最大的是01111 1111為127

負數要注意,在計算機內部,採用2的補碼形式儲存負數,首先我們來了解一下計算機的原碼,反碼,補碼的計算:

反碼:
如果一個數為正數:則它的原碼,反碼相同
如果一個數為負數:則符號位為1,其餘各位按位取反
例如:8和-8
8的二進位制表示為0000 1000 反碼為0000 1000
-8的二進位制表示為1000 1000 反碼為1111 0111

補碼:
如果一個數為正數:則它的原碼,補碼相同
如果一個數為負數:補碼為負數的絕對值的按位取反然後加1
例如:8和-8
8的二進位制表示為0000 1000 補碼為0000 1000
-8的絕對值是8,按位取反後為1111 0111 再加1得到1111 1000,所以1111 1000位-8的補碼

所以1111 1111代表-1,最小的負數是1000 0000為-128,不妨我們來計算一下1111 1111是補碼,我們逆向運算,先減一,得到1111 1110,然後再按位取反,得到0000 0001,得到1,再加上負號即為-1,1000 0000道理一樣,最後得到的結果是128,所以能表示最小負數位-128。

好了,回到我們開始的例子,從例子(1)開始,我說這個會報錯,是因為a是byte型別的,但是1是int型別的,int型別不能和byte型別直接進行運算。所以會報錯,我們可以把例子改為

byte a = 127;
a += 1;
System.out.println(a);

這樣就不會報錯了,但是輸出的結果是什麼呢,我們看一下127的二進位制表示是0111 1111,而-128是1000 0000,127+1就是-128,那結果是不是呢?沒錯,輸出結果就是-128

那讓我們再看例子(2),b是int型別的,int型別是32位,所以456在計算機中的表示方式是00000000 00000000 00000001 11001000,但是當int強制轉換為byte的時候,只保留最後八位,即11001000,這個數最高位是1,所以表示一個負數,而計算機中負數都是以補碼形式表示的,我們還得進行轉換,即先減一得到1100 0111,然後再按位取反得到0011 1000,結果為56,所以11001000表示的是-56,所以輸出結果為-56。

最後,說明一個關於byte型別的說法,不知道大家聽沒聽說過“Java虛擬機器中沒有byte型別”這個說法,其實也不無道理,我來簡單的說明解釋一下,java虛擬機器對基本型別的操作都是在棧上面完成的,當java處理一個語句的時候,會先把相關的運算元壓入到棧中,然後再彈出來進行計算,最後將結果再次壓入到棧中,對byte的操作也是一樣,但是,在將byte型別壓入到棧之前,會將byte型別轉換成int型別壓入到棧,彈出的也是int型別。結果也是int型別,說以我們進行計算的byte型別都是按照int型別的長度進行計算的,也就是說int將byte型別擴充了,怎麼擴充的,下面來解釋一下:

比如說正數1,用byte來表示是0000 0001,這個沒有問題,但是java虛擬機器會對它進行帶符號位擴充套件,0000 0001第一位是0,那麼java虛擬機器會用0來填充剩下的24位,使其成為一個int型別,結果就是 00000000 00000000 00000000 00000001,int型別也是1

但是,如果想讓byte型別的值等於-1,那就不是用int型別的-1表示了,而是找到一個正整數的int型別,然後Java虛擬機器對它進行擷取,變成byte型別的-1,這個正整數就是2147483647

int a = 2147483647;
byte b = (byte)a;

這樣b的值就是-1了,因為2147483647二進位制表示為01111111 11111111 11111111 11111111,是32位的,但是要強制轉換成byte型別的話,Java虛擬機器就會將前面的24位全部截掉,剩下1111 1111,而這個數又是補碼錶示的,我們先減一得到1111 1110,然後按位取反得到0000 0001,得到正數1,所以這個1111 1111表示的是-1,如果我們想要再次轉換成int型別,則因為符號位是1,Java虛擬機器自動用1填充剩下的24位,結果為11111111 11111111 11111111 11111111,這個數就是int型別的-1

總結:小小byte大世界

相關推薦

java基本資料型別byte

首先,來兩個例子: 例子(1) byte a = 127; a = a + 1; System.out.println(a); 例子(2) int b = 456; System.out.println((byte)b); 猜一下例子(1)和例

Java基礎學習總結(122)——Java基本資料型別的包裝類及其裝箱拆箱詳解

一、基本資料型別及對應的包裝類基本資料型別對應的包裝類byteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublebooleanBoolean每個包裝類的物件可以封裝一個相應的基本型別的資料,並提供了其它一些有用的方法。包裝類物

Java基本資料型別所佔位元組

資料型別  位元組數 byte      1位元組 short     2位元組 char      2位元組(C語言中是1位元組) float     4位元組 int       4位元組

java基本資料型別的大小,以及他們的封裝類

   在我們面試或者考試過程中經常會考到八種基本資料型別以及它們的封裝類,那麼有哪八種基本資料型別呢?它們的封裝類又是什麼呢?     首先,八種基本資料型別分別是:int、short、float、double、long、boolean、byte、char;它們的封裝

一張圖教你看懂Java基本資料型別

String和Integer不是Java的八種基本資料型別。char只能儲存一個字元(用單引號),String能夠儲存多個字元(用雙引號)。String屬於final類,定義的是物件,Integer 是 java 為 int 提供的封裝類。int 的預設值為 0,

淺談Java中的基本資料型別

1)四種整數型別(byte、short、int、long):    byte:8 位,用於表示最小資料單位,如檔案中資料,-128~127    short:16 位,很少用,-32768 ~ 32767    int:32 位、最常用,-2^31-1~2^31  (21 億

Java 基本資料型別 byte底層

  byte: byte 資料型別是8位、有符號的,以二進位制補碼錶示的整數; 最小值是 -128(-2^7); 最大值是 127(2^7-1); 預設值是 0; byte 型別用在大型陣列中節約空間,主要代替整數,因為

java小練習(使用基本資料型別定義個變數,然後在控制檯輸出各個變數的值)

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱:

Java四類基本資料型別

第一類:邏輯型boolean 第二類:文字型char 第三類:整數型(byte、short、int、long) char型別佔2個位元組 short從-32768到32767 int從-2147483648,到2147483647共10位 long從-9

Java基本資料型別佔用位元組空間總結

基本資料型別 所佔用空間大小 byte b; 1位元組 short s; 2位元組 int i; 4位元組 long l; 8位元組 char c; 2位元組(C語言中是1位元組) float f; 4位元組 double d; 8位元組 boo

基本資料型別各自所佔空間大小

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

基本資料型別變數宣告

package com.hisoft.java.Bean; public class Test1 { static int age=12; // String str = new String("abc");引用型別變數的宣告 public static void ma

Java基本資料型別詳解

1.int是基本資料型別,Integer是int的封裝類,是引用型別。int預設值是0,而Integer預設值是null,所以Integer能區分出0和null的情況。一旦java看到null,就知道這個引用還沒有指向某個物件,再任何引用使用前,必須為其指定一個物件,否則會報錯。2.基本資料型別在宣告時系統會

基本資料型別的大小,以及他們的封裝類。

byte short int long float double char boolean 基本型別:byte二進位制位數:8包裝類:java.lang.Byte最小值:Byte.MIN_VALUE=

基本資料型別的大小以及他們的封裝類

Java中分為兩大資料型別 :基本資料型別和引用資料型別 基本資料型別分為8種: 基本型別:byte 二進位制位數:8 包裝類:java.lang.Byte 最小值:Byte.MIN_VALUE=-128 最大值:Byte.MAX_VALUE=127 基本型別:short

Java——基本資料型別byte陣列相互轉化

我們直接上程式碼 package cn.com.eteamsun.utils; import java.nio.charset.Charset; /** * Java基本資料型別和byte陣列相互轉化 * @author liuyazhuang * */ p

Java中8基本資料型別及其預設值

Java語言中有8種基本資料型別,基本情況彙總如下: Java中8種基本資料型別總結 序號 資料型別 大小/位 封裝類 預設值 可表示資料

Java初認識--基本資料型別(int 和byte之間賦值)預設值 型別強轉

主類和主方法 Test.java–是原始檔,原始檔必須與主類名(public class )保持一致,一個原始檔只能有一個主類 ,主方法存在與主類中。 Test.java 原始檔 主類:public class Test 主方法 : public static void main(Strin

弄懂進位制、bit、java基本資料型別byte、short、int 、char 、String)、ASCII、Unicode、UTF-8、UTF-16的關聯關係及UTF-8、UTF-16編碼原理

首先普及一下基本概念: 1.數值(百度百科):指的是用數目表示的一個量的多少; 2.進位制(百度百科):也就是進位計數制,是人為定義的帶進位的計數方法。對於任何一種進位制---X進位制,就表示每一位置上的數運算時都是逢X進一位。 十進位制是逢十進一,十六進位制是逢十六進一,二進位制就是逢二進

Java初認識--基本資料型別(int 和byte之間賦值)預設值 型別強轉

主類和主方法 Test.java–是原始檔,原始檔必須與主類名(public class )保持一致,一個原始檔只能有一個主類 ,主方法存在與主類中。 Test.java 原始檔 主類:public class Test 主方法 : public stat