型別強制轉換與計算機的原碼,補碼,反碼

2021-06-21 23:49:35 字數 3107 閱讀 5417

今天因為運算元據庫,將資料庫的int型別強制轉換為tinyint型別,才終於明白其中的轉換原理。

平時使用c語言也經常 使用強制轉換,但是一直都感到有點模糊,為什麼轉換出來的值是這個,怎麼來的卻不清楚,只知道與補碼有關。

於是有空檢視了下 原碼與補碼,反碼的概念。

1)原碼表示法

原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進位制形式表示。設有一數為x,則原碼表示可記作[x]原。

例如,x1=+1010110

x2= 一1001010

其原碼記作:

[x1]原

=[+1010110]原

=01010110

[x2]原=[-1001010]原

=11001010

原碼表示數的範圍與二進位制位數有關。當用8位二進位制來表示小數原碼時,其表示範圍:

最大值為0.1111111,其真值約為(0.99)

10最小值為1.1111111,其真值約為(一0.99)

10當用8位二進位制來表示整數原碼時,其表示範圍:

最大值為01111111,其真值為(127)

10最小值為11111111,其真值為(-127)

10在原碼表示法中,對0有兩種表示形式:

[+0]原

=00000000

[-0]原

=10000000

2)補碼表示法

機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;**自:圖碼網)如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。設有一數x,則x的補碼表示記作[x]補。

例如,[x1]=+1010110

[x2]= 一1001010

[x1]原

=01010110

[x1]補

=01010110

即      [x1]原

=[x1]補

=01010110

[x2]原

= 11001010

[x2]補

=10110101+1=10110110

補碼表示數的範圍與二進位制位數有關。當採用8位二進位制表示時,小數補碼的表示範圍:

最大為0.1111111,其真值為(0.99)

10最小為1.0000000,其真值為(一1)

10採用8位二進位制表示時,整數補碼的表示範圍:

最大為01111111,其真值為(127)

10最小為10000000,其真值為(一128)

10在補碼表示法中,0只有一種表示形式:

[+0]補

=00000000

[+0]補

=11111111+1=00000000(由於受裝置字長的限制,最後的進製丟失)

所以有[+0]補

=[+0]補

=00000000

3)反碼表示法

機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。設有一數x,則x的反碼表示記作[x]反。

例如:x1=+1010110

x2= 一1001010

[x1]原=01010110

[x1]反

=[x1

]原=01010110

[x2]原

=11001010

[x2]反

=10110101

反碼通常作為求補過程的中間形式,即在乙個負數的反碼的未位上加1,就得到了該負數的補碼。

例1.已知[x]原

=10011010,求[x]補

。分析如下:

由[x]原

求[x]補

的原則是:若機器數為正數,則[x]原

=[x]補

;若機器數為負數,則該機器數的補碼可對它的原碼(符號位除外)所有位求反,再在未位加1而得到。現給定的機器數為負數,故有[x]補

=[x]原

十1,即

[x]原

=10011010

[x]反

=11100101 十)

1     

[x]補

=11100110

例2.已知[x]補

=11100110,求[x]原。

分析如下:

對於機器數為正數,則[x]原

=[x]補

對於機器數為負數,則有[x]原

=[[x]補]補

現給定的為負數,故有:

[x]補

=11100110

[[x]補]反

=10011001

十)         1   

[[x]補]補

=10011010=[x]原

然後就是在計算機中,是使用資料的反碼來儲存的,反碼再轉換成原碼就是它的實際值了,知道這個很重要。

例子:smallint 型別資料 -32768  -32767  32767 0 2  轉換為tinyint型別

samllint 是2個位元組,16位,tinyint是乙個位元組,8位

對於-32768 其在計算機中的補碼為1000...00000000,轉換為 tinyint 只取後面的8位,於是00000000就是取出來的資料的補碼,而最前面的0 表示正數,正數的原碼就是它的補碼,所以-32768 轉換為tinyint 的值為 0

對於-32767 其在計算機中的原碼為:11111..111111111,取反加1,則為它的補碼,所以補碼為:1000..000000001,轉換為tinyint ,取後面的8位,00000001,正數,所以轉換後的值為1

對於32767 它的補碼為 011111.111111,取後面的8位111111111,為負數,減1 ,再取反得10000001 ,所以轉換後的值為-1

注意:這是大轉小的情況,如果是小轉大,如smallint轉int,那麼新新增的位的值,全部都是符號位,

如-1 ,被碼為:111111111,轉換為int ,那麼被碼為:1111111...111111111,轉換後的仍為 -1

計算機 原碼 反碼 補碼

在計算機中,用補碼來表示數字,因為 1 這樣可以比較方便的表示0 保證0作為正數或者負數補碼都是00000000 2 計算時用補碼直接加減就是最終數值 符號位參與運算 1.原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 ...

計算機原碼, 反碼, 補碼

乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 3 而不是形式值131 10000011轉換...

計算機原碼,反碼,補碼

最近花了點時間對計算機的原碼,反碼和補碼進行了研究,對為什麼要有反碼和補碼以及他們這麼設計的原因有了一定的理解 機器數 乙個數在計算機中的表現形式叫做機器數,這個數有正負之分,在計算機中用乙個數的最高位 符號位 用來表示它的正負,其中0表示正數,1表示負數。例如正數7,在計算機中用乙個8位的二進位制...