1.當執行乙個運算時,如果它的乙個運算子是有符號的而另乙個是無符號的,
那麼c語言會隱式的講有符號引數強制轉換為無符號數,並假設這兩個數都是非負的.
這個有可能導致一些問題的發生。摘自《深入理解計算機系統[p48]>>
舉個例子,寫乙個程式,判斷字串str1長度大於字串str2,一般的寫法是這樣的:
if((strlen(str1) - strlen(str2)) > 0)
printf("str1 is longer!/n");
else
printf("str2 is longer!/n");
但是,這個程式永遠是輸入 str1 is longer!
你知道為什麼嗎?如果有誤,如何修改呢?
2.另外,計算機所用的數字編碼形式,絕大部分都是用補碼來表示。
舉個例子,比如說 int a = 0xffffffff;
轉換成二進位制則為:[一位變四位,十六進製制於二進位制的轉換]
1111 1111 1111 1111 1111 1111 1111 1111
也就是4個位元組,(假定機器是32位的).
那麼,如果執行 printf("%d",a); 將輸出值為 -1
原因在於補碼的計算方法,第一位表示符號位,1為負,0為正.
所以,0xffffffff = -1*232+1*231+1*230+....+1*20 = -1;
C語言 對有符號數和無符號數的理解
1 提出問題 如果在計算機的記憶體種存放了二進位制1000 0000,它代表的值究竟是多少?2 基礎概念 原碼 反碼 補碼 正數的原碼 補碼 反碼,例如 對於十進位制數128,它的原碼 反碼 補碼分別是 原碼 1000 0000 反碼 1000 0000 補碼 1000 0000 負數的原碼等於它本...
C 有符號數和無符號數
1.有符號數和無符號數 c支援所有整形資料型別的有符號數和無符號數運算。儘管c標準並沒有指定某種有符號數的表示,但是幾乎所有的機器都使用二進位制補碼。通常,大多數數字預設都使有符號的,c也允許無符號數和有符號數之間的轉換,轉換原則是基本的位表示保持不變。因此在一台二進位制補碼機器上,當從無符號數轉換...
有符號數和無符號數
有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...