C語言無符號數與有符號數的運算原則

2021-10-25 10:28:03 字數 1373 閱讀 5489

int

main

(void

)return0;

}

啥都不輸出,因為:

1、sizeof()返回的是unsigned int型別

2、有符號數與無符號數進行運算時,有符號數先自動轉換成無符號數

因此"i < sizeof(int)"比較時-1會轉換成unsigned int型別,溢位到unsigned int的最大值,導致大於sizeof(int)

int

main

(void

)else

if(c >0)

else

return0;

}

1、a+b,b要轉為無符號,即4294967276,可以理解為無符號下-20,

再加a就是4294967282,即ffff fff2,可以理解為無符號下-14,因此輸出回%d有符號十進位制就是-14

2、a+b的值是ffff fff2,肯定大於0,所以輸出a + b > 0

3、c是int型別有符號整數,所以同%d輸出一樣,無符號下-14值轉有符號十進位制是-14,所以c小於0

int

main

(void

)

i為-1。因為short佔2位元組,所以是16位,

short最大值為0111 1111 1111 1111,為32767

short最小值為1000 0000 0000 0000,首位為符號位,1代表負數所以得轉為原碼

首位符號位取反,其餘所有位也取反後最後一位加1

即0111 1111 1111 1111 + 1 = 1000 0000 0000 0000即32768,所以該負數的原碼為32768,該負數為-32768

65535比32767溢位32768,而溢位1就是-32768,因此溢位32768偏移32767就是-32768+32767=-1。

總結,無符號數與有符號數的運算原則如下:

1、參與運算的型別不同,會自動轉換成相同型別再運算。

2、轉換的方向為向資料長度增長的方向,char->short->int->unsigned int ->long

3、所有float都會先轉成double進行運算,哪怕只有乙個float

4、賦值運算時,賦值號右邊的型別向左邊的型別轉換。

5、浮點數和整形數,整形數向浮點數轉換。

6、在表示式中,如果char和short型別的值進行運算,無論char和short有無符號,結果都會自動轉換成int。

7、如果char或short與int型別進行計算,結果和int型別相同。即:如果int是有符號,結果就是帶符號的,如果int是無符號的,結果就是無符號的。

有符號數與無符號數運算

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

有符號數與無符號數

關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...

Verilog 有符號數與無符號數運算

無符號數運算,左值位寬不夠,發生截斷的現象 2.兩個無符號數運算,賦值給乙個有符號的數。可以看出,右側先按照無符號數進行運算,取得的運算結果按照左側的符號進行資料顯示。3.兩個無符號數運算,無符號數賦負值 補碼 按照該補碼對應的正值進行處理。結果同上。4.有符號數和無符號數運算,賦值給有符號數。補碼...