C语言有符号和无符号数
%x表示無符號十六進制
 %#x表示0x的十六進制
 %o 無符號以八進制表示的整數
 %lu表示輸出無符號長整型整數
 %u表示輸出無符號整型整數
輸出結果為:
 a>b a=-1 b=1
 當執行一個運算時(如這里的a>b),如果它的一個運算數是有符號的而另一個數是無符號的,那么C語言會隱式地將有符號 參數強制類型為無符號數,并假設這兩個數都是非負的,來執行這個運算。
原因: (把有符號的變成了無符號的)
 把if語句改為if(a > (int)b)即可。這樣程序就會認為是兩個有符號數在進行比較,-1就不會隱式地轉換為無符號數而變成UMax。在32和64位的機子上,-1對應的無符號數應該是4 294 967 295,即32位的無符號數的最大值(UMax)
解決: (無符號轉為有符號)
 把if語句改為if(a > (int)b)即可。這樣程序就會認為是兩個有符號數在進行比較,-1就不會隱式地轉換為無符號數而變成UMax。
建議:
 盡量避免有符號數與無符號數的比較運算和避免減法運算,在很多時候,在unsigned的世界里,x-y>0與x>y都是不等價的。
extern int a; //聲明一個變量 (標準的聲明)
 int a; //定義一個變量 如果已經被定義了,則為聲明
無符號char類型數運算
 unsigned char s = 0;
 s = s - 1;
 printf(“%d\n”,s) //輸出255 相當于0加上-1的補碼 0000 0000 + 1111 1111 = 1111 1111 (255)
有符號char類型數運算
 char s = 127; 0111 1100
 s = s + 5; 0111 1111
 補碼 =》原碼 符號位不變,其它位取反,最后一位加1,
 例如:
 補碼:1000 0100 132
 過程:1111 1011 =》1111 1100
 原碼:0111 1100 -127
當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。
總結
以上是生活随笔為你收集整理的C语言有符号和无符号数的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python下批量修改图片格式和大小
- 下一篇: 【大数据之路-阿里巴巴大数据实践】第一篇
