在c語言中,進行混合運算時,編譯系統遵循一定規則,完成資料型別的自動轉換,即隱式型別轉換。一般是占用記憶體位元組數少型別,向占用記憶體位元組數多的型別進行轉換,以防止精度丟失。
unsigned int與int相比,擁有更大的正數範圍。所以,無符號數與有符號數進行運算時,先需要將有符號數轉化為無符號數進行操作。以下**所展示出的結果,就驗證了這一特點。
#define _crt_secure_no_warnings
#include#includeint main(int argc, char *argv)
在上述**中,-10會被編譯器轉換為無符號的int型別,其二進位制形式為:1111 1111 1111 0110(與其絕對值相同的正數10正是它取反加一的結果)。它與無符號數5(二進位制形式為0000 0000 0000 0101)相加的結果,就是1111 1111 1111 1011。這個數被作為無符號數在進行比較時,是遠遠大於0的;做輸出時,因為有%d,即以有符號數int型進行輸出,所以列印的結果是-5(1111 1111 1111 1111是-1,上面的數第三個二進位制位為0,所以比-1小4,即為-5)。
再看下面一段**:
#define _crt_secure_no_warnings
#include#includeint main(int argc, char *argv)
無符號的int型別與有符號的int型別在進行比較時,也會將有符號數轉換為無符號數再進行比較。同理,將-1的補碼作為正數形式比較,遠遠大於2。
且讓我們再將以上**稍加改動:
#define _crt_secure_no_warnings
#include#includeint main(int argc, char *argv)
當a與b進行加法運算時,int型別資料溢位,高位被自動捨棄,結果為正數1,所以大於0。
如下**即可驗證a+b的值為1:
#define _crt_secure_no_warnings
#include#includeint main(int argc, char *argv)
解決此類問題,只需記得同型別有無符號數進行加減或比較時,會先將有符號數轉換為無符號數進行操作,這樣即可根據數值的補碼自行判斷結果。 C語言中 有符號數 無符號數 整數溢位
c語言中存在兩種整數算術運算,有符號型和無符號型。無符號數運算 所有無符號數運算都是以2的n次方為模,n是結果中的位數 所以它不存在運算時的沒有那種所謂的 溢位 當它超過範圍時,從零開始重新計數!當乙個無符號數和有符號數相加的時候,有符號數會自動轉化為無符號數參與運算!有符號數運算 是可能發生 溢位...
C語言中 有符號數 無符號數 整數溢位
includevoid main 這個的結果134,而不是我之前認為的很大的正數,實際上需要注意的是 1 0xffffffff 被提公升為unsigned int後是乙個差1就溢位的unsigned int,所以相加後結果是134。但是如果l 10000,那麼結果就真是乙個很大的正數了,因為不涉及溢...
C語言中的有符號數與無符號數
1.c語言支援所有整型資料型別的有符號和無符號運算,儘管c語言標準並沒有指定用哪種方式來表示有符號整數,但是幾乎所有的 機器都使用補碼。2.c 語言中預設的整形資料是有符號的,並且允許無符號數和有符號數之間進行轉換。轉換的原則是底層的位保持不變。3.執行運算時,如果乙個運算數是有符號的而另乙個是無符...