他的巧妙之處在於,用乙個對稱的 digits 陣列搞定了負數轉換的邊界條件(二進位制補碼的正負整數表示範圍不對稱)。**大致如下,經過改寫:
[c-sharp]view plain
copy
const
char* convert(char buf, int value)
; static
const
char* zero = digits + 9; // zero 指向 '0'
// works for -2147483648 .. 2147483647
int i = value;
char* p = buf;
do while (i != 0);
if (value < 0)
*p = '/0';
std::reverse(buf, p);
return p; // p - buf 即為整數長度
}
這段簡短的**對 32-bit int 的全部取值都是正確的(從 -2147483648 到 2147483647)。可以視為 itoa() 的參考實現,面試的標準答案。
也就是說,如果 m、d 都是整數,
int q = m / d;
int r = m % d;
那麼c語言只保證 m == q*d + r。如果 m、d 當中有負數,那麼 q 和 r 的正負號是由實現決定的。比如 (-13)/4 == (-3)或 (-13)/4 == (-4) 都是合法的。如果採用後一種實現,那麼這段轉換**就錯了(因為將有 (-1) % 10 == 9)。只有商向 0 取整,**才能正常工作。
帶符號數的編碼
這裡對定義不再贅述,直接記錄計算方法和心得。原碼 非常直觀的機器碼,與真值差別不大。正數前補0,後面照抄 負數前補1,後邊照抄。小數相同處理方法。反碼 解決負數加法運算問題,將減法運算轉換為加法運算。正數前補0,後面照抄 負數前補1,真值部分0變1,1變0 1001 11001 10110 結果 補...
帶符號數的表示
上一節,我們學習了進製計數制及其相互轉換,這次我們來看下計算機中帶符號數的表示 在一般算術表示中使用 和 來表示正數與負數,而在計算機中使用 0 和 1 來表示正數和負數 用 或 表示正負的數叫真值 用 0 或 1 表示正負的數叫機器數 原碼表示 二進位制數的最高位表示符號,0表示正,1表示負,數值...
帶符號大整數計算器 C 實現)
為帶符號大整數定義乙個類。將帶符號大整數表示成兩個值 乙個是絕對值,用無符號大整數表示,乙個是符號,用整形數表示,1表示正號,1表示負號。過載輸入和輸出運算子 和 帶符號大整數以 1234567890,1234567890668這樣的形式來輸入和輸出。注意可能在輸入時包含有正號,所以必須支援像 12...