程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言中獲取整數和浮點數的符號位

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

編輯:關於C語言

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


1. 為什麼要獲得符號位

 

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

 

if (x > 0) {
    x = x - 1;
} else {
    x = 1 - x;
}

if (x < 0) {
   x = -x;
}

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

 

 

 

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)

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved