C語言中獲取整數和浮點數的符號位

2021-06-29 05:46:43 字數 1317 閱讀 4776

1. 為什麼要獲得符號位

很多時候,我們需要判斷數值的正負,來做相應的邏輯處理。條件判斷語句可以很好的完成這個需求。有時候會有下面的情況,

if (x > 0)  else 

if (x < 0)

正負只是數值的符號位變化,或是計算結果的符號位變化。但是我們需要用乙個判斷,首先條件判斷會影響效率,其次格式不夠簡潔美觀。所以,有時候希望能不用條件判斷也解決問題。而數值的符號位已經被儲存在了數值的最高位,可以利用這點來避免條件判斷。

2.  如何得到符號位

可能有很多種方法。但是通過移位來獲得符號位是最直接想到的。移位有左移右移, 右移因為有符號位的問題。所以,有2個情況,有符號右移和無符號右移。有符號右移空位補符號位,無符號右移空位補0。當把有符號數,符號位移動到右邊第一位的時候,結果-1就是負數,0就是正數。當把無符號數,符號位移動到右邊第一位時候,結果1是負數,0正數。

3. 一種實現方法

因為浮點數無法移位,所以要麼強轉成整數處理,要麼就要拆成陣列處理。這裡我們使用當做陣列處理。

首先,我們把數值無論什麼型別當做char陣列來處理,

(signed char*) &x

這樣數值就被分割都多個char型別的空間中,符號位就儲存在最高位的char空間中。

((signed char*) &x)[sizeof(x) - 1]

我們假定小端儲存模式,那麼符號位就在char陣列的最後乙個空間。我們拿到了有符號位的char資料並且當做有符號數來處理。

((signed char*) &x)[sizeof(x) - 1] >> 7

右移7位表示把符號移動到右邊第一位,那麼,正數就是0,負數就是-1

最後,完整的巨集定義

/**

* get x sign bit only for little-endian

* if x >= 0 then 1

* if x < 0 then -1

*/#define mathutils_signbit(x) \

(((signed char*) &x)[sizeof(x) - 1] >> 7 | 1)

結果與1或,是把[0, -1]對映到[1, -1], 這樣我們就可以把最開始的例子寫成這樣:

x   = (x - 1) * mathutils_signbit(x)

x *= mathutils_signbit(x)

c語言整數轉浮點數 浮點數的秘密

我們在學習 c 語言時,通常認為浮點數和小數是等價的,並沒有嚴格區分它們的概念,這也並沒有影響到我們的學習,原因就是浮點數和小數是繫結在一起的,只有小數才使用浮點格式來儲存。其實,整數和小數可以都使用定點格式來儲存,也可以都使用浮點格式來儲存,但實際情況卻是,c 語言使用定點格式儲存整數,使用浮點格...

整數和浮點數

python支援對整數和浮點數直接進行四則混合運算,運算規則和數學上的四則運算規則完全一致。基本的運算 1 2 3 6 4 5 6 14 7.5 8 2.1 3.0375使用括號可以提公升優先順序,這和數 算完全一致,注意只能使用小括號,但是括號可以巢狀很多層 1 2 3 9 2.2 3.3 1.5...

C語言中的浮點數比較

浮點數分為單精度和雙精度兩種。在記憶體中的儲存方式按照ieee754標準。通常情況下,單精度佔4個位元組,雙精度佔8個位元組。可以使用sizeof驗證一下。include int main 輸出結果為4 8 x和y變數在十進位制數值上是相等的都是0.1。但是0.1用二進位制表示的時候就會丟失精度,只...