溫故知新之資料型別二進位制表示

2021-05-27 17:49:51 字數 1571 閱讀 6301

(1)負數在記憶體中是怎麼儲存的?

有符號正數的表示方法是最高位代表符號位,0表示正數,1表示負數。比如0000 0011表示3(只用乙個位元組來示意),

那麼-3怎麼表示呢?按道理應該是1000 0011,但實際是不是這樣的。因為3+(-3)應該=0,看看下面的計算:

0000 0011

+ 1000 0011

=1000 0110

這個結果顯示不是0,二是「-6」。因此,計算機需要一種優雅而簡單的方式來表示-3,使得+3後能夠=0,所以:

0000 0011

+ ?=

0000 0000

把3取反後得到了1111 1100,

0000 0011

1111 1100

+=1111 1111

取反以後得到了全部是1,這也不是0。但是我們知道計算的時候,一旦當最高位溢位的時候,最高位就被丟棄了。全1的

基礎上再+1正好把最高位丟棄,其餘位全部變成了0。即

0000 0011

1111 1100

0000 0001(+1)

+=0000 0000

這樣就得到了0,所以計算機表示的-3就是1111 1101,即正數二進位製取反+1得到的結果,即補碼。相反從-3得到+3可通

過-1,取反來得到。

(2)浮點數的表示方法

對於32位的float

符號位(s) 階碼(e)  尾數(m)

1        8        23

看看123.456是怎麼表示的,二進位制形式: 1111011.01110100101111001 = 1.11101101110100101111001 * 2^6(右移了6

位)符號位(s) 階碼(e)  尾數(m)

0     00000110  11101101110100101111001

(3)型別擴充套件(賦值)

小型別到大型別(比如char 到 short),最高位如果是1,則自動擴充套件填充高位位1,這樣擴大了的型別的值仍然沒有變

,即:0111 1111 的負數是 1000 0001 , 當乙個位元組擴充套件到兩個位元組時,發現高位位1 ,擴充套件得到:1111 1111 1000 0001,

這也是乙個負數,通過-1並取反可以得到0000 0000 0111 1111,所以通過這樣處理,是數學意義上正確的。

大型別到小型別(比如short到char),直接階段高位,保留低位。

(4)型別轉換

比如 float 轉換到 int,或者int轉換到float 從(1)(2)可以看得出來,int和float在二進位制層面的儲存機制是不

一樣的,但是:

int i = 4

float f = i

f是多少呢?是4.但是按照二進位制來展開並進行4位元組直接拷貝的話,f肯定不是4. 所以 位模式不同的情況下,編譯器會

進行為模式轉換,得到正確的結果。那麼,再看看下面的情況:

int i = 3;

float f = *(float*)&i;

這是f就不是3了,編譯器就不會對int到float進行位模式轉換了,而使直接將i的首位址開始直接拷貝4位元組到f的記憶體,

得到的結果不可預知了。

溫故知新 資料型別

char 定長 長度不夠會自動補齊空格 浪費空間 varchar2 多餘的長度不會補空格 節省磁碟空間declare v len1 char 10 abc v len2 varchar2 10 abc begin dbms output.put line v len1的長度 length v len...

列印資料的二進位制表示

分類 stl 演算法分析 2012 03 08 11 06 494人閱讀收藏 舉報 float date author liubao date 2011 4 4 brief 列印資料的二進位制形式 include include include 列印字元的二進位制表示,結尾不含換行符 param c...

二進位制資料型別

二進位制資料報括 binary varbinary 和image binary 資料型別既可以是固定長度的 binary 也可以是變長度的。binary n 是n 位固定的二進位制資料。其中,n 的取值範圍是從1 到 8000 其儲存窨的大小是 n 4 個位元組。varbinary n 是n 位變長...