概述
計算機存儲的格式是二進制位,8個二進制位表示一個字節,在計算機中二進制位有原碼,反碼和補碼的格式,下面分別介紹
原碼:最高位表示符號位,正數0,負數1;其余7位表示數值因此,一字節原碼的表示范圍-127到127
反碼:正數的反碼和原碼相同,負數的反碼為除符號位其余取反即,0變1,1變0,一字節原碼的表示范圍-127到127
補碼:正數的補碼和原碼相同,負數的補碼為反碼+1,一字節原碼的表示范圍-128到127
為了簡化基礎電路設計,計算機中加法就是將兩個二進制位相加,減法就是加上一個負數,對應的符號位參與運算,乘法是左移運算,除法是右移運算
使用原碼進行計算,結果不正確,
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
使用反碼計算,在0的時候會出問題,雖然邏輯上我們理解的0和-0是一樣的,但是在反碼中的表示不一樣0的反碼是0000 0000,-0的反碼是1111 1111
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
使用補碼計算,結果正確,在補碼中不管是0還是-0補碼都為0000 0000
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原
補碼的最小值為-128
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補=-128
因此計算機中存儲一個字節是使用補碼來表示,一個字節表示-128到127
編碼
計算機保存數據是通過保存二進制數據,我們使用的字符在計算機內存儲的僅僅是二進制數據,那為啥會出現亂碼呢?這里就涉及到編碼和字符集的問題
最初計算機中只有ASCII字符集和編碼,只表示128個字符;后來計算機發展字符和編碼需要擴充,就有了Unicode字符集和對應的UTF-8,UTF-16等編碼。Unicode字符集表示了各個國家100多萬字符。中國也有自己的字符集和字符編碼,如GBK和GB18030
字符集相當于字典,每一個字符都有唯一的一個id,編碼就是字符在計算機中存儲的形式,比如:UTF-8將字符集中的每一個字符id通過一個算法獲得了這個字符在計算機中的儲存格式,幾個字節,每個字節的大小,因此盡管UTF-8和UTF-16都是基于Unicode字符集,但是同一個字他們的存儲字節數,每個字節大小幾乎不盡相同
亂碼出現的原因就是,我這個字是基于UTF-8存儲的,你使用UTF-16的編碼來想翻譯我,對不起,對應的字節數和字節大小和你想表達的字不是同一個,只能給你亂碼顯示了,比如“漢”字在這兩種編碼中就有不同的顯示。
字符集和字符編碼一般都是同時制定的,編碼不止字符編碼,還有圖像聲音編碼等來保存音頻視頻
參考文章
原碼,反碼,補碼詳解
徹底理解字符編碼