(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 位變長...