關於byte儲存 128的問題

2021-07-11 20:13:12 字數 1118 閱讀 4598

首先,byte的儲存範圍是-128到127,那麼是怎麼做到的呢,我覺得這乙個解釋方法可以解釋。

首先,乙個8位2進製的數可以表示的範圍是0到255,即【0000 0000】到【1111 1111】,那麼我們把最左邊的一位看做是正負號的標示,那麼正數的範圍是【0000 0000】到【0111 1111】,即0到127.負數的範圍是【1000 0001】到【1111 1111】,即-127到-1,。

這個時候我們會發現,【1000 0000】這個數究竟代表什麼數好呢,如果把它看做是-0,好像不大合適,那麼,我們就要看看從二進位制的數的補碼的意義。

補碼即是把二進位制的減法轉化為加法來進行計算,如果相加得出的數超出了8位,那麼即捨去最高位,如果把捨去後的最高位看做是乙個數,這就相當於我們做的運算是在0到255之間迴圈,假如超過了255,即轉化為0到256之間的乙個數,比如計算的結果是257,那麼就相當於0到255的結果的2。

現在我們解決了資料溢位的問題,然後把最高位看做是正負號的標示,也就相當於我們把取值範圍從0到255轉移到了-127到127之間,但是還有乙個【1000 0000】表示什麼呢?那麼我們看看兩個數之間的轉換規律:

我們先把128剔除(因為它的二進位制數是【1000 0000】),把原本的數設為a,轉換後的數設為b,然後他們之間有乙個關係:

公式1:當0<=a<128時,b=a;(b為整數)

公式2:當128其實他們二進位制的標示就是最高位的差別。

那麼假如說把128考慮進去,它的二進位制數是【1000 0000】,很明顯它不符合整數的命名規範,只能是負數了,而運用公:2,它只能表示為-128(儘管128不在取值範圍裡面,但也只能擴張公式2的取值範圍而不是擴張公式1的取值範圍),也就是說,範圍是0到255裡面的128,到了範圍是-127到127裡面的數,沒有對應的數,只能把範圍擴大,即範圍擴大到-128到127。

78        原碼:【0100 1110】   反碼:【0100 1110】   補碼【0100 1110】 

-123    原碼:【1111 1010】   反碼:【1000 0101】   補碼【1000 0110】

正數的原碼、反碼、補碼都相同,負數的反碼是原碼的除符號位外的數都取反,補碼是反碼加1。

-123的補碼如果直接轉換為2進製的數的話是133,剛好滿足公式二:-123=133-256。

byte的範圍為何是 128到127

但是我感覺不可能吧,如果是這樣的話,那byte的設計應該是有問題的 於是我便自己算了一下 以下是運算過程 首先是最大值 乙個位元組八位 最大就是0111 1111 也就是 1 2 0 1 2 1 1 2 7 127 這個很好算沒錯 那麼問題來了,負數呢?我們知道負數在計算機中的儲存是以補碼的形式存在...

關於前端儲存token儲存位置的問題

一.我們首先要知道vuex,localstorage和sessionstorage區別 參考文章 1 localstorage 優點 a,localstorage生命週期是永久,這意味著除非使用者顯示在瀏覽器提供的ui上清除localstorage資訊,否則這些資訊將永遠存在。b,相同瀏覽器的不同頁...

關於ORACLE時間儲存的問題

公司用oracle的資料庫,以前直接存實體的時候沒出現時間轉換問題。昨天,手寫sql語句 不是hql 時,傳date型別的資料給時間列,oracle報錯,不能識別,語句無效。解決方法共享 方法一 把date型別的資料,用 dateformat將date型別轉換成string 型別 dateforma...