1. 程式人生 > 其它 >小楊初學Java的筆記03

小楊初學Java的筆記03

day03 一、原碼、反碼、補碼 1、原碼、反碼、補碼轉換 在計算機內,有符號數有3種表示法:原碼、反碼和補碼。(針對二進位制來說) 在計算機內部,所有資料的運算都是採用補碼進行的。(因為補碼是唯一的) 以7和-7為例 原碼:就是二進位制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其餘位表示數值的大小。 符號位 數值位 7的原碼: 0 0000111 -7的原碼: 1 0000111 反碼:正數的反碼與其原碼相同; 負數的反碼是對其原碼逐位取反,但符號位除外。 符號位 數值位 7的反碼: 0 0000111 -7的反碼: 1 1111000 補碼:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。 符號位 數值位 7的補碼: 0 0000111 -7的補碼: 1 1111001 2、練習 1)、已知某數X的原碼為10100111B,試求X的補碼和反碼。 符號位 數值位 原碼: 1 0100111 反碼: 1 1011000 補碼: 1 1011001 2)、已知某數X的補碼11011001B,試求其原碼。 符號位 數值位 補碼: 1 1011001 反碼: 1 1011000 原碼: 1 0100111
二、變數 1、概述 1)、數學層面:a=10,b=20, c=a+b 2)、Java層面:在java程式執行過程中,其值可以在一定範圍內變化的量叫變數 a、限定條件 資料型別 b、參與運算的變數要有名稱 變數名 3)、定義變數的格式: a、資料型別 變數名 = 初始化值; b、資料型別 變數名; 變數名 = 初始化值; c、資料型別 變數名1,變數名2; 變數名1 = 初始化值; 變數名2 = 初始化值; 4)、備註 a、作用域的問題 變數定義在哪個大括號內,它就在哪個大括號內有效 並且,在同一個大括號內不能定義同名的變數 b、在方法內部沒有初始化值的變數不能直接使用,只需要在使用之前賦值就可以了,不一定非要在定義的時候賦值 c、推薦使用第一種定義變數的格式 d、雖然可以同時定義多個變數,但是最好一行上只定義一個變數 三、資料型別 1、分類 基本資料型別 引用資料型別(面向物件的時候再學習) 2、基本資料型別(四種八類) 概述:Java語言是強型別語言,對於每一種資料都定義了明確的具體資料型別,在記憶體總分配時會分配不同大小的記憶體空間 1)、整數型別 佔用位元組數 表示的數值範圍 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 2)、浮點型別 float(單精度浮點數) 4 double(雙精度浮點數) 8 3)、字元型別 char 2 4)、布林型別 boolean 1 3、注意事項 1)、定義long型別的變數資料,某尾要加上L(推薦)或者l 舉例:long a=3100000000L; 2)、定義float型別的變數資料,末尾要加上F(推薦)或者f 舉例:float d=312.64F; 3)、小數預設是double型別,整數預設是int型別 4)、運算過程中參與運算的的資料型別要保持一致 5)、基本資料型別之間的資料型別轉換 預設轉換 byte,short,char—int—long—float—double byte,short,char相互之間補轉換, 他們參與運算首先轉換為int型別 強制轉換 目標型別 變數名=(目標型別)(被轉換的資料); int i = 4; byte b = 3; //byte c = i+b;(會報錯) byte c = (byte)(i+b); 總結:byte,short,char一律自動轉換為int 小轉大預設轉換 大轉小強制轉換(轉換過程中大的數值比小的數值多餘的位數部分會被擷取,導致數值會有偏差) 4、例題 1)、請問下列程式碼有沒有問題 a、double d = 12.34; float f = d; 有問題,d 是double型,不能直接賦值給float型的f,只能強制轉換:float f = (float) d; b、float f1 = (float)12.34; float f2 = 12.34F; 程式碼沒有問題,但是f1表示的是從double型強制轉換為float型的12.34 (當數值精度很高的時候,這種表示可能會導致資料丟失) f2則表示的是float型的12.34 2)、下列程式碼哪一句會編譯失敗,為什麼 byte b1=3,b2=4,b; b=b1+b2; b=3+4; 第二句語句會出現問題,即:b=b1+b2; a、變數相加,首先會看型別問題,最終把結果的賦值也會去考慮型別問題,因為byte,short,char 他們參與運算首先轉換為int型別,此時b1和b2就轉換為int型別了,不能再直接賦值給b b、常量之間相加,首先會做加法運算,然後看這個結果是不是在接收資料型別的範圍內, 如果在,就直接賦值,3+4=7,7在byte的取值範圍內,因此不會報錯 3)、byte b = (byte)130的輸出結果是多少,為什麼 解析:byte的數值範圍是-128~127之間,130不在其範圍內, 在計算機內部的計算都是用補碼進行的,所以要先把130表示為二進位制補碼形式, 擷取掉超出部分,再換算成原碼,求出最終結果。注:byte b = 130是錯誤的 具體步驟: 130預設是int型別,佔四個位元組,因此它的原碼為 00000000 00000000 00000000 10000010 轉換成byte型別擷取前三個位元組得到 10000010 該結果為補碼,再換算成原碼 符號位 數值位 補碼: 1 0000010 反碼: 1 0000001 原碼: 1 1111110 最終得到11111110,最高位為符號位,結果為-126 延申: byte b = (byte)131 ==> -125 byte b = (byte)132 ==> -124 byte b = (byte)256 ==> 0 4)、看程式寫結果 System.out.println('a'); //a System.out.println('a'+1); //98 System.out.println("hello"+'a'+1); //helloa1 System.out.println('a'+1+"hello"); // 98hello System.out.println("5+5="+5+5); //5+5=55 System.out.println(5+5+"=5+5"); //10=5+5 在輸出結果中有加號連線時 字串資料和其他資料做加法,此時這裡的加號不是做加法運算,而是字串連線符,結果依舊是字串。 當加號兩邊是數字或者一邊是數字,一邊是字元,此時的加號是做加法運算的。 在數字與字元做加法的過程中,字元使用的是ASCLL碼,ASCLL碼中幾個重要節點如下: '0' 48 'A' 65 'a' 97 四、運算及運算子 1、相關概念 1)、運算: 對常量和變數進行操作的過程稱之為運算 2)、運算子:(類似於 + - * /等等) 對常量和變數進行操作的符號稱之為運算子 3)、運算元: (類似於2 b‘a’) 參與運算的資料稱之為運算元 4)、表示式:(類似於1+1 ,'b'+2) 用運算子把常量或者變數連線起來的並且符合java語法的式子稱之為表示式。 不同運算子連線起來的式子體現的是不同型別的表示式 5)、運算子分類 算術運算子、賦值運算子、比較遠算符、邏輯運算子、位運算子、三目運算子 2、算術運算子 +,-,*,/,%,++,-- 運算子解釋: 1)、System.out.println(3/4); ==> 0 /符號表示是整除的意思,並且取的結果是商的整數部分 如果要讓結果有小數表示,只需要將其中一個變數變成浮點型別參與運算就可以了 System.out.println(3/(4*1.0)); ==> 0.75 2)、System.out.println(3%4); ==> 3 %算術運算子參與運算的時候,進行的是除法,但是結果取的是餘數 System.out.println(4%3); ==> 1 3)、++,-- 單獨使用的時候: ++表示的是自增1,結果沒有任何影響 --表示的是自減1,結果沒有任何影響,放前放後結果一樣 結合表示式使用的時候: 無論是++還是--,放在後面先賦值後做自加或者自減 如果放在前面,是先自加或者自減,然後再賦值 舉例:(以下部分只是表達意思,並未按Java語法要求編寫) int a,b,c; a = 2; b = 3; a++; ==> 3 ++a; ==> 3 b--; ==> 2 --b; ==> 2 c = a++; ==> c = 2,a = 3 c = ++b; ==> c = 4,b = 4 c = a--; ==> c = 2,a = 1 c = --b; ==> c = 2,b = 2 3、賦值運算子 =,+=,-=,*=,/=,%= 運算子解釋: 最基本的賦值運算子是= 1)、+= int a1 = 10; a1 += 20; System.out.println(a1); ==> 30 (a1 + 20) 2)、-= int a2 = 10; a2 -= 5; System.out.println(a2); ==> 5 (a2 - 5) 3)、*= int a3 = 10; a3 *= 5; System.out.println(a3); ==> 50 (a3 * 10) 4)、/= int a4 = 10; a4 /= 5; System.out.println(a4); ==> 2 (a4 / 5) 5)、%= int a5 = 10; a5 %= 5; System.out.println(a5); ==> 0 (a4 % 5) 6)、例題 下列程式碼有沒有問題,如果有,問題在哪 short s=1; s = s+1; short s1=1; s1 += 1; s有問題,因為在執行s = s+1時,1是int型,而s是short型,型別不一致 s1沒有問題,在執行s1 += 1時,計算機底層會進行強制轉換,此時並不是簡單的s = s+1, 而是轉換成s = (s的資料型別)(s+1),預設包含了強制型別轉換 4、比較運算子 ==,!=,<,>,<=,>= 相關字元解釋 (1)==:判斷是否相等 (2)!=:判斷是否不相等 (3)<,>,<=,>=:判斷大小關係 (4)比較運算子的結果要麼是true要麼是false,其結果是一個布林型別       明天繼續