無符號數和有符號數字操作的一些注意事項

2022-04-03 12:31:49 字數 937 閱讀 2278

看下面的**會出現什麼結果,程式判斷不出 a > -100,看來無符號數與有符號數比較可要小心了

uint a = 10;

if(a > -100)

下面結果也一樣

uint a = 10;

int  b = -100;

if(a > b)

有符號數與無符號數之間運算問題

以下實驗均在virual c++6中執行通過

這個問題測試是否懂得c語言中的整數自動轉換原則 ,有些開發者懂得極少這些東西。當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別 。因此,從這個意義上講,無符號數的運算優先順序要高於有符號數,這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常重要的。

首先進行乙個實驗,分別定義乙個signed int型資料和unsigned int型資料,然後進行大小比較:

unsigned int a=20;

signed int b=-130;

a>b?還是b>a?實驗證明b>a,也就是說-130>20,為什麼會出現這樣的結果呢?

關鍵點:這是因為在c語言操作中,如果遇到無符號數與有符號數之間的操作,編譯器會自動轉化為無符號數來進行處理,因此a=20,b=4294967166,這樣比較下去當然b>a了。

再舉乙個例子:

unsigned int a=20;

signed int b=-130;

std::cout《減法和乘法的運算結果類似。

如果作為signed int型資料的b=-130,b與立即數之間操作時不影響b的型別,運算結果仍然為signed int型:

signed int b=-130;

std::cout《而對於浮點數來說,浮點數(float,double)實際上都是有符號數,unsigned 和signed字首不能加在float和double之上,當然就不存在有符號數根無符號數之間轉化的問題了

有符號數和無符號數

有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...

無符號數和有符號數

人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...

有符號數和無符號數

刷題刷到了有符號數的問題,回顧一下知識點 有符號數 signed 可以區分正負數 最高位表示數值的正負 0表示正數,1表示負數 無符號數 unsigned 不區分正負數 只有整數型別 雖然無符號數所能表示的最大數值大於有符號數,但兩者所能表示的數值範圍相同。eg.short int 128,0 0,...