C語言中無符號數和有符號數相加問題

2021-07-09 18:13:25 字數 1071 閱讀 5085

32位的int的最大值與最小值,最大值2的31次方-1====pow(2,31) - 1,最小值為負的2的31次方=    -pow(2,31)

c語言中沒有次冪的運算子,,,「^」是異或的運算子。

看個題:

#include

int main()

結果是:-14  >6

意想不到吧?

為什麼結果這樣呢?

原來有符號數和無符號數進行比較運算時(==,<,>,<=,>=),有符號數隱式轉換成了無符號數(即底層的補碼不變,但是此數從有符號數變成了無符號數),比如上面 (a+b)>6這個比較運算,a+b=-14,-14的補碼為1111111111110010。此數進行比較運算時,被當成了無符號數,它遠遠大於6,所以得到上述結果。

自己做個實驗

uint32_t u32os_curtimestamp = 0 - 1;

int i32os_timesinterval = -pow(2,3);

(1)    printf("test 1 stamp=%u,val=%d,val=%x!", u32os_curtimestamp , i32os_timesinterval , i32os_timesinterval);

(2)    i32os_timesinterval = i32os_timesinterval - u32os_curtimestamp;

(3)   printf("test 2  stamp=%x,val=%d,val=%x!", u32os_curtimestamp , i32os_timesinterval , i32os_timesinterval);

test 1 stamp=4294967295,val=-8,val=fffffff8!

test 2  stamp=ffffffff,val=-7,val=fffffff9!

分析i32os_timesinterval的初值為-8,u32os_curtimestamp的初值為ffffffff,且一直沒有改變。當執行第二條指令時,是有符號數與無符號數的運算,隱式轉換為無符號數即為fffffff8。然後fffffff8-ffffffff= fffffff9,將fffffff9轉換為有符號數就是-7

C 有符號數和無符號數

1.有符號數和無符號數 c支援所有整形資料型別的有符號數和無符號數運算。儘管c標準並沒有指定某種有符號數的表示,但是幾乎所有的機器都使用二進位制補碼。通常,大多數數字預設都使有符號的,c也允許無符號數和有符號數之間的轉換,轉換原則是基本的位表示保持不變。因此在一台二進位制補碼機器上,當從無符號數轉換...

有符號數和無符號數

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

無符號數和有符號數

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