C語言對於 有符號 和 無符號 數字的處理

2021-05-23 22:22:48 字數 704 閱讀 7944

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...