常用的進制
二進制
八進制
十進制
十六進制
進制之間是可以互相轉換的。
進制如何轉換 以二進制和十進制進制為例
10 -> 2
不停的除以2直 至結果是1 然后從1開始 從下至上 拼接余數(shù)
2 -> 10
1010 -> 10 02^0 + 12^1 + 02^2 + 12^3 = 10
1110 -> 14 02^0 + 12^1 + 12^2 + 12^3 = 14
100000000 -> 256 1*2^8 = 256
從右至左 用該位的值 * 2^x次方 x初始值是0 每次遞增1
先來了解一下計算機的存儲單位和原碼 反碼 補碼的概念。
計算機最小的存儲單位:比特bit 苍息。8bit == 1 字節(jié)
java里的數(shù)據(jù)存儲和計算 都是使用補碼來操作的
二進制有正負之分菠净,但是計算機并不識別正負號,為了讓計算機識別正負號透罢,引入了符號位0,1刨啸,
0代表正获茬,1代表負履恩。且把符號位置于該數(shù)的最高數(shù)值位之前锰茉,這樣表示的數(shù)稱為機器數(shù)(或稱機器碼),
即把符號位和數(shù)值位一起編碼來表示的數(shù)就是機器數(shù)
1.原碼
符號位為0表示正數(shù)切心,為1表示負數(shù)數(shù)值部分用二進制數(shù)的絕對值表示的方法稱為原碼表示法飒筑,通常用[X]原表示X的原碼。
例子:
+59的原碼為:00111011
-59的原碼為: 10111011
2.反碼
一個數(shù)如果為正绽昏,則它的反碼與原碼相同协屡;一個數(shù)如果為負,則符號位為1而涉,其余各位是對原碼取反著瓶。
例子:
+59的反碼為:00111011
-59的反碼為: 11000100
3.補碼
一個數(shù)如果為正联予,則它的原碼啼县、反碼、補碼相同沸久;一個數(shù)如果為負季眷,則符號位為1,其余各位是對原碼取反卷胯,然后整個數(shù)加1子刮。
例子:
+59的反碼為:00111011
-59的反碼為: 11000101
Java的數(shù)據(jù)類型
java是一門強類型的語言 任何變量聲明必須指定類型。成員變量具有初始值 初始值是什么取決于數(shù)據(jù)類型窑睁。
java中數(shù)據(jù)類型都有哪些呢挺峡?
1. 基本數(shù)據(jù)類型 -- 4類8種
2. 引用數(shù)據(jù)類型 -- 主要包括 類 數(shù)組 接口
八種基本數(shù)據(jù)類型
1.數(shù)值類型--整數(shù)類型
1.1 字節(jié)型:用 byte 來表示,用8位2進制存儲 占1個字節(jié) 取值范圍[-128,127]担钮。
1.2 短整型:用 short 表示橱赠,用16位2進制表示 占2個字節(jié) 取值范圍 [-32768,32767]。
1.3 整型:用 int 表示箫津,用32位2進制表示 占4個字節(jié) 取值范圍[-231,231-1] 取值范圍[-2147483648,2147483647]狭姨。
1.4 長整型:用 long 表示,用64位2進制表示 占8個字節(jié) 取值范圍 [-263,263-1]苏遥。
注意 整型數(shù)據(jù)默認是 int 類型 可以把不超出byte范圍的數(shù)據(jù) 賦值給 long饼拍。
在整型數(shù)據(jù)之后加一個 l或L 可以標識為 long類型的數(shù)據(jù) 可以增加取值范圍,由于小寫的l 和 整數(shù)1 太相似 故推薦使用 大寫L田炭。
2.數(shù)值類型--浮點型
2.1 單精度:用 float 表示师抄, 32位2進制表示 占4個字節(jié) 取值范圍 比long大的多 E38
它保證了7位有效數(shù)字 不保證第八位是否有效 也不保證一定無效。
2.2 雙精度:用 double 表示教硫, 64位2進制表示 占8個字節(jié) 取值范圍比 float司澎,它保證了15位有效數(shù)字 參與運算時使用 14位 故它成為雙精度欺缘。
注意:所有的浮點型默認是double類型的 且不能把不超出范圍的浮點型數(shù)據(jù) 給 float存儲
如何讓浮點型數(shù)據(jù)表示為 float類型呢 ?
加小寫f 或大寫 F
浮點型數(shù)據(jù) 使用科學計數(shù)法來存儲 所以他們的取值范圍遠遠大于整型挤安。
3.數(shù)值類型--字符型
字符型:用 char 表示谚殊,16位二進制 占2個字節(jié) 取值范圍[0,65535]
一對單引號括起來的 單個字符 就是一個字符型數(shù)據(jù),字符型數(shù)據(jù)可以參與運算蛤铜,因為字符型數(shù)據(jù)參與運算時 使用的自己的位置號 也可以說是編碼值嫩絮。
例如:"ABCDEFG" 'A' 65 'B'66 'C'67
注意: 字符型數(shù)據(jù)對應的整數(shù) 沒有負數(shù)
4.布爾類型
布爾型:用 boolean 表示,它只有兩個值 true和 false 代表真和假
它支持邏輯運算 因此又稱為邏輯類型 它是電腦可以進行邏輯運算的 重要支持围肥。它占4個字節(jié) 如果在數(shù)組中 它占1個字節(jié)
Java里基本數(shù)據(jù)類型轉換(不涉及到 布爾型)
分為兩種情況:
1.自動轉換
2.強制轉換
大類型轉到小類型數(shù)據(jù)剿干,不能自動的轉換需要進行強制轉換,否則會報錯
如何進行強制轉換呢 穆刻?
格式:
小類型 小類型變量 = (小類型)大類型變量 || 小類型變量 = (小類型)大類型變量
引用數(shù)據(jù)類型強轉置尔,也是這個格式。
類型強制轉換會引發(fā)問題嗎氢伟?
小類型 真實空間不夠使用 那么在大類型數(shù)據(jù)里進行截取 截取之后數(shù)據(jù)可能會發(fā)生改變榜轿,如果真的超出了取值范圍 那么盡量不要強轉。
Java的運算符
算數(shù)運算符
內容 : + - * / % ++ --
特性 : 兩個數(shù)值進行算術運算符操作 其表達式就是算數(shù)表達式
算數(shù)表達式會有結果值 也可以表達式執(zhí)行完會有返回值朵锣,結果是兩個操作數(shù)中 大類型的類型谬盐。如果操作數(shù)的雙方均為 byte short char 中的類型 那么結果自動上升到 int 類型。
++ 自增
-- 自減
使用格式1 :
int i = 0;
i++; i--;
使用格式2 :
int i = 0;
++i; --i;
每當程序執(zhí)行到 ++ 時 诚些, 都會使得變量的值增加 1
每當程序執(zhí)行到 -- 時 飞傀, 都會使得變量的值減少 1
注意 ++ -- 只能操作用于變量
我們發(fā)現(xiàn) ++ -- 既可以出現(xiàn)在變量的前面 還可以出現(xiàn)在變量的后面 有什么區(qū)別嗎?
當 ++ -- 在前面時 會先自增自減再使用變量
當 ++ -- 在后面時 會先使用變量在自增自減
看個例子:
public class MapNullToNothing {
public static void main(String[] args) {
int a = 6;
int b = 3;
System.out.println(b);//輸出結果是 3
int i = b++;
System.out.println(b);//輸出結果是 4
System.out.println(i);//輸出結果是 3
int y = b--;
System.out.println(b);//輸出結果是 3
System.out.println(y);//輸出結果是 4
int x = ++a;
System.out.println(a);//輸出結果是 7
System.out.println(x);//輸出結果是 7
int z = --a;
System.out.println(a);//輸出結果是 6
System.out.println(z);//輸出結果是 6
}
}
賦值運算符
分為普通的賦值符 =
還有擴展賦值運算符 += -= *= /= %=
% java里叫 取模
x += y 等價于 x = x+y;
x -= y 等價于 x = x-y;
x = y 等價于 x = xy;
x /= y 等價于 x = x/y;
x %= y 等價于 x = x%y;
擴展的賦值運算還有一個特殊的功能 诬烹,隱含了類型的強制轉換
關系運算符
< > >= <= == !=
兩個值 進行關系運算符運算 那么就變成了關系表達式,關系表達式會返回一個 布爾型 的結果砸烦。
三目運算符
格式: 布爾表達式(表達式結果是布爾值) ? 表達式1(可以返回任意類型的值) :表達式2(可以返回任意類型的值)
x ? y : z ;
執(zhí)行規(guī)則
當程序來到三目運算符時 , 會首先計算布爾表達式的值
如果結果為 true 那么整個表達式選擇表達式1為整個表達式的結果
如果結果為 false 那么整體表達式選擇表達式2為整個表達式的結果
使用三目運算符求值:
// 最大值
max = x > y ? (x > z ? x : z) : (y >z ? y : z) ;
// 最小值
min = x < y ? (x < z ? x : z) : (y < z ? y : z);
// 中間值
num = x > y ? (x < z ? x : ( y > z ? y : z )) : (y < z ? y : (x > z ? x : z));
邏輯運算符
&邏輯與 &&短路與
格式 :
布爾值1 & 布爾值2 結果是 布爾值
布爾值1 && 布爾值2 結果是 布爾值
執(zhí)行規(guī)則:
如果布爾值1 和 布爾值2 結果均為 true 那么整個表達式結果為true
反之 結果為 false
&和&&不同之處
& 如果布爾值1為false的話 仍然會判斷 布爾值2 的值
&&如果布爾值1為false的話 那么直接得到結果 不去判斷 布爾值2
只要沒特殊要求 那么使用 && 因為效率高
|邏輯或 ||短路或
格式:
布爾值1 | 布爾值2 結果是 布爾值
布爾值1 || 布爾值2 結果是 布爾值
執(zhí)行規(guī)則:
如果布爾值1 和 布爾值2 其中有一個值或兩個值為 true 那么整個表達式為 true
反之 整個表達式為 false
不同之處
| 如果布爾值1 為true 仍然會判斷布爾值 2
|| 如果布爾值1位 true 那么不會判斷布爾值2 直接得出結果
!非
格式:
绞吁!布爾值 結果是布爾值 取反
執(zhí)行規(guī)則
如果布爾值 為true 那么結果為 false
如果布爾值 為false 那么結果為 true
^異或
格式
布爾值1 ^ 布爾值2 結果是布爾值
執(zhí)行規(guī)則
當布爾值1 和 布爾值2 一個為 true 一個為 false 時 整個表達式結果是 true
反之 表達式結果為 false
位運算符
變量 使用位運算符 如果是 byte short char,那么會先提升到 int類型
如果 要用 a * 4 那么效率最高的做法是 a << 2
<< 左移 補0
格式 : x << y
執(zhí)行規(guī)則:x 左移 y位幢痘,等同于 x * 2^y
例如 5 << 2 == 5 * 2^2
0 0000101 5的補碼
0 0001010 左移一位
0 0010100 左移兩位 2^2 + 2^4 = 20
1 0000101 -5的補碼
1 0010100 左移兩位 == -20
>> 右移 補符號位
格式: x >> y ,等同于 x / 2^y
例如 5 >> 1 == 2
0 0000101 5的補碼
0 0000010 右移一位 2
3 >> 1 == 1
0 0000011
0 0000001 == 1
負數(shù) 右移
-5 > 1 = -3
1 0000011
1 0000101
1 0000101 -5的補碼
1 0000100 -5的反碼
1 1111011 -5的原碼
1 1111101 右移一位 會導致少一位 補符號位
1 0000010 反碼
1 0000011
-4 >> 1
1 0000100 -4的補碼
1 0000011 -4的反碼
1 1111100 -4的原碼
1 1111110 -4原碼右移一位 補1
1 0000001 反碼
1 0000010 補碼
-4 >> 2
1 0000100 -4的補碼
1 0000011 -4的反碼
1 1111100 -4的原碼
1 1111111 -4右移2兩位 補兩個1
1 0000000 反碼
1 0000001 補碼
注意 :
正數(shù)右移 補0
負數(shù)右移 補1
總體來說 補符號位
>>> 無符號右移
正數(shù)右移 n位 補0
負數(shù)右移 n位 補0
-4 >> 1 == 2147483647
1 24個1 1111100 -4的原碼
01 24個1 111110