有符號(int)和無符號(unsigned int)
unsigned int plus_a = 12;unsigned
int plus_b = 13
;int result_c = plus_a - plus_b > 0 ? plus_a - plus_b : 0;
上面得到的結果: -1
不應該是0的嗎? 除錯可以發現 plus_a - plus_b 得到的結果是乙個很大的整數(因為是unsigned int 型別,最高位的正負標誌位也被當成資料本身,
並非是int 型別的時候的正負標誌了),所以表示式中的條件是成立的,那最終結果應該是最大的那個數啊(因為是plus_a - plus_b),
我猜測是運算結果賦給了 int 型別,
再來驗證一下
unsigned int plus_a = 12;unsigned
int plus_b = 13
;unsigned
int result_c = plus_a - plus_b > 0 ? plus_a - plus_b : 0;
上面的結果是:4294967295
再看下面一段**
unsigned int plus_a = 12;unsigned
int plus_b = 13
;int result_c = (int)(plus_a - plus_b) > 0 ? plus_a - plus_b : 0;
結果是:0
應該是兩個 unsigned int 型別運算結果就是 unsigned int型別
所以在使用unsigned int 型別的時候,要注意這些問題,
我得回去重新讀《深入理解計算機系統》相關章節了,竟然都不敢肯定的分析這個現象了
記錄一下,希望對技術同仁們有些幫助,願上帝賜福與你們!
有符號與無符號
最高位為1,表示這個數為負數 最高位為0,表示這個數為正數 include int main 執行結果 正數的補碼為正數本身 負數的補碼為負數的絕對值各位取反後加1 8位整數5的補碼為 0000 0101 8位整數 7的補碼為 1111 1001 16位整數20的補碼為 0000 0000 0001...
無符號與有符號
一,小精度往大精度轉換。1.1c語言中比int小的整型 包括short unsigned short unsigned char和char 在運算中都要轉換成int然後進行運算 unsigned char a unsigned char b a b 10,a和b分別先轉換成int,再計算 1.2同精...
2 有符號無符號
計算機中的符號位 include intmain int argc,char const ar 有符號數的表示法 8位整數 5 的補碼為 0000 0101 8位整數 7 的補碼為 1111 1001 16位整數的 20 的補碼為 0000 0000 0001 0100 16位整數 13 的補碼為 ...