判斷無符號整型和有符號整型

2021-08-17 08:09:12 字數 1270 閱讀 2657

在計算機記憶體裡,整數以補碼形式儲存(正數的補碼即原碼)。

正數如 50000 :
原碼為:0000 0000 0000 0000 1100 0011 0101 0000

補碼為:0000 0000 0000 0000 1100 0011 0101 0000

負數如-100 :
原碼為 : 1000 0000 0000 0000 0000 0000 1100 0100

補碼為 : 1111 1111 1111 1111 1111 1111 0011 1100

可用如下**以二進位制輸出各位驗證。
#includeint i = 50000;

bitset<32>bs(i);

cout<

參考菜鳥教程的示例

#include using namespace std;

int main()

無符號短整型變數j = 50000儲存為

1100 0011 0101 0000 (無符號)

將j賦給有符號短整型變數i,即i的值在記憶體中的儲存形式為

1100 0011 0101 0000 (有符號)

對乙個數的補碼求補碼即本身。

1100 0011 0101 0000 的補碼為 1011 1100 1011 0000

即-15536

給定乙個數,如何區分有符號還是無符號呢?

首先無法用函式實現目的。函式形式引數的型別是在函式內部定義的,所以它無法穿越呼叫這一關。

因此,必須編寫乙個巨集,根據引數的宣告對它進行處理。接下來就是區別巨集的引數到底是乙個型別還是乙個型別的值。

假定引數是乙個值,無符號數的本質特徵是它永遠不會是負的,有符號數的本質特徵是對最左邊乙個位取補將會改變它的符號。

(比如2的補碼表示,它肯定是個負數)。

由於作為引數的這個值的其它位與這個測試無關,你可以對它們全部取補,結果是一樣的。

因此,可以像下面這樣嘗試:

#define isunsigned(a) (a >=0 && ~a >= 0)
如果巨集的引數是乙個型別,其中乙個方法是使用型別轉換:

#define isunsigned(type) ((type)0 - 1 > 0)

無符號整型與有符號整型的比較

喵哥最近遇到乙個問題,比較兩個數的時候經常會出現很嚴重的bug,比如 unsigned int a 0 int b 2 if a b b 1 cout b endl 乍一看這段 輸出的應該是 2,0肯定不會小於 2嘛,但是事實上,b 1 這行 是會被執行的。如果大家對算術轉換比較熟悉的話,應該會想到...

CoreSeek有符號整型

資料庫status欄位的值有 1,0,1 設定過濾字段,發現sql attr uint不支援負數,後改用sql attr bigint sql attr bigint status被宣告的列的值必須在32位無符號整型可表示的範圍內。超出此範圍的值也會被接受,但會溢位。例如 1會變成 2 32 1 或...

學習無符號整型和有符號整型數的範圍

可以看出來,32位有符號整數可表示的最大數大於20億,32位無符號整數可表示的最大數大於40億,因此,碰上十幾億的海量資料處理時,不要慌 1 在32位系統中2 int的範圍是 2147483648,2147483647 3 unsigned int的範圍是 0,4294967295 4const u...