A. java中byte的加法
byte的范圍是-128到127,超出了的部分到下一個循環里
b3比上限超出了29,所以最終是-100
PS,127+1在byte里會變成-128,所以不是直接用-128+29,而是-128+28,因為原來的數字加上1才能到-128
B. JAVA 位運算 (byte) (a << 2); 是什麼意思
您好,你的問題,我之前好像也遇到過,以下是我原來的解決思路和方法,希望能幫助到你,若有錯誤,還望見諒!展開全部
你看下這篇文章就清楚了
首先要明白一點,這裡面所有的操作都是針對存儲在計算機中中二進制的操作,那麼就要知道,正數在計算機中是用二進製表示的,負數在計算機中使用補碼表示的。
左移位:<<,有符號的移位操作
左移操作時將運算數的二進制碼整體左移指定位數,左移之後的空位用0補充
右移位:>>,有符號的移位操作
右移操作是將運算數的二進制碼整體右移指定位數,右移之後的空位用符號位補充,如果是正數用0補充,負數用1補充。
例子:
public static void main(String[] args)
{
System.out.println(3<<2);//3左移2位
System.out.println(-3<<2);//-3左移2位
System.out.println(6>>2);//6右移2位
System.out.println(-6>>2);//-6右移2位
}
輸出結果
12
-12
1
-2
下面解釋一下:
00000000 00000000 00000000 00000011 +3在計算機中表示
00000000 00000000 00000000 0000001100 左移2位,補0,結果為12
----------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000011 +3在計算機中表示
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111101 -3在計算機中表示
11111111 11111111 11111111 1111110100 左移2位,補0,結果為負數,就是補碼了,求原碼
10000000 00000000 00000000 00001011
10000000 00000000 00000000 00001100 結果-12
----------------------------------------------------------------------------------------------
這也說明了一個問題:在計算機中,以1開頭的就是補碼的形式,是負數。
00000000 00000000 00000000 00000110 +6在計算機中表示方法
0000000000 00000000 00000000 00000110 右移兩位,正數補0,結果為1
----------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110 +6在計算機中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在計算機中的表示
1111111111 11111111 11111111 11111010 右移兩位,結果為負數
1000000000 00000000 00000000 000001
1000000000 00000000 00000000 000010 結果為-2
這個地方很容易弄混,多想幾次就會慢慢理解了。
上面解釋了帶符號的移位操作,下面解釋一下不帶符號的移位操作
無符號的移位只有右移,沒有左移使用「>>>」進行移位,都補充0
例如:
public static void main(String[] args)
{
System.out.println(6>>>2);
System.out.println(-6>>>2);
}
結果:
1
1073741822
分析:
00000000 00000000 00000000 00000110 +6在計算機中表示方法
0000000000 00000000 00000000 00000110 右移兩位,正數補0,結果為1
-----------------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110 +6在計算機中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在計算機中的表示
0011111111 11111111 11111111 11111010 右移兩位,補充0,結果為1073741822
以下來自:
可以參考
移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:
(1)<< : (left-shift), 最低位補0
(2)>> : (signed right-shift), 右移過程使用符號位擴展(sign extension),即如果符號為為1則高位補1, 是0則補0,也就是邏輯右移
(3)>>> : (unsigned right-shit),右移過程使用零擴展(zero extension),即最高位一律補0,也就是算術右移
(4)移位操作的數據類型可以是byte, char, short, int, long型,但是對byte, char, short進行操作時會先把它們變成一個int型,最後得到一個int型的結果,對long型操作時得到一個long型結果,不可以對boolean型進行操作。
(5)移位操作符可以和=合並起來,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示將a右移兩位後的值重新賦給a。當時在使用這三個操作符對 byte, char, short型數據進行操作時要注意,例如有一下代碼片段:非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!
C. JAVA中byte類型的介紹。 謝謝
1、在Java中,byte類型的數據是8位帶符號的二進制數。最高位表示正負,0為正,1為負。
2、java byte是做為最小的數字來處理的,因此它的值域被定義為-128~127,也就是signed byte。
3、正數的最高位都是 0 ,正數的值就是二進製表示的值。
4、負數的最高位都是 1 ,負數的值是 取反後加一 然後加個負號得到的值。
(3)javabyte與運算擴展閱讀
1、java基本數據類型
JAVA中一共有八種基本數據類型,分別是byte、short、int、long、float、double、char、boolean。
2、java各數據類型取值范圍
byte,整型,1個位元組,范圍:-2的7次方 ~ 2的7次方-1;
short,整型,2個位元組,范圍:-2的15次方 ~ 2的15次方-1;
int,整型,4個位元組,范圍:-2的31次方 ~ 2的31次方-1;
long,整型,8個位元組,范圍:-2的63次方 ~ 2的63次方-1;
float,浮點型,4個位元組,范圍:3.402823e+38 ~ 1.401298e-45;
double,浮點型,8個位元組,范圍:1.797693e+308~ 4.9000000e-324;
char,文本型,2個位元組,范圍:0~2的16次方-1;
boolean,布爾型,1個位元組,范圍:true/false;
參考資料
網路-java字元型
D. java中byte的加減
首先計算機將127轉換成二進制形式即1111111
byte的范圍是-128---127之間
b+1 結果是10000000 剛好是128
二進制的運算.這就是原理
E. java(byte)>>>時怎麼運算的
0xa2是142, 已經超過了 byte 的存儲空間(-128~+127),會溢出,得到了一個未知的數.
>>>是無符號右移,對於正數相當於除以了4(2^2).
F. java中byte的問題
0xFF == 二進制的:1111 1111
& 是按位與運算,任何一個byte & 0xFF都得原有的數,它主要應用於int等,可以參照這個:http://..com/question/2055765535243071187
所以你上面的例子中的兩個&0xFF是廢代碼
第一個函數原本的意思應該為了截取最後一個位元組。但是因為傳遞的不是int而是byte導致變得是byte強制類型轉換為int,是個失敗的設計,因為只要強制轉換為byte就能達到相同效果了。多此一舉
第二個函數是為了取得一個數對應的十六進制字元串,不過也跟上面的一樣,因為傳遞的是byte,導致整個設計也是失敗的。
G. JAVA中byte類型的介紹。 謝謝
Java也提供了一個byte數據類型,並且是基本類型。java byte是做為最小的數字來處理的,因此它的值域被定義為-128~127,也就是signed byte。
byte,即位元組,由8位的二進制組成。在Java中,byte類型的數據是8位帶符號的二進制數。
在計算機中,8位帶符號二進制數的取值范圍是[-128, 127],所以在Java中,byte類型的取值范圍也是[-128, 127]。
運算規則:
####正數的最高位都是 0 ,正數的值就是二進製表示的值。 ####
####負數的最高位都是 1 ,負數的值是 取反後加一 然後加個負號得到得值。 ####
用8位的二進制來說明此規則:
比如:00000001。最高位是0 為正數 ,那麼表示的就是 十進制的 1。
再比如:10000001.最高位是1 為負數,值是多少?取反得到 01111110 加1 得到 01111111 ,那麼值為 -127
理解此運算規則我們正式開始說byte,byte正好是8位的二進制數。short是16位 int是32位 long是64位。
上述代碼,最後會輸出-56。原因如下:
200的二進製表示是111001000,由於int是32位的二進制,所以在計算機中,實際上是00000000000??111001000,當int轉成byte的時候,那麼計算機會只保留最後8位,即11001000。
然後11001000的最高位是1,那麼表示是一個負數,而負數在計算機中都是以補碼的形式保存的,所以我們計算11001000的原碼為00111000,即56,所以11001000表示的是-56,所以最後test的值為-56。
Java編譯程序生成位元組碼(byte-code),而不是通常的機器碼。Java位元組碼提供對體系結構中性的目標文件格式,代碼設計成可有效地傳送程序到多個平台。Java程序可以在任何實現了Java解釋程序和運行系統(run-time system)的系統上運行。
在一個解釋性的環境中,程序開發的標准「鏈接」階段大大消失了。如果說Java還有一個鏈接階段,它只是把新類裝進環境的過程,它是增量式的、輕量級的過程。
因此,Java支持快速原型和容易試驗,它將導致快速程序開發。這是一個與傳統的、耗時的「編譯、鏈接和測試」形成鮮明對比的精巧的開發過程。