久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

您好,歡迎進入深圳市穎特新科技有限公司官方網站!

您現在的位置:首頁 新聞資訊 >> 新聞頭條 >> C語言中的正負數及其輸出
新聞資訊
NEWS INFORMATION

C語言中的正負數及其輸出

發布時間:2019-05-22

在數學中,數字有正負之分。在C語言中也是一樣,short、int、long 都可以帶上正負號,例如:

//負數
short a1 = -10;
short a2 = -0x2dc9;  //十六進制
//正數
int b1 = +10;
int b2 = +0174;  //八進制
int b3 = 22910;
//負數和正數相加
long c = (-9) + (+12);

如果不帶正負號,默認就是正數。

符號也是數字的一部分,也要在內存中體現出來。符號只有正負兩種情況,用1位(Bit)就足以表示;C語言規定,把內存的最高位作為符號位。以 int 為例,它占用 32 位的內存,0~30 位表示數值,31 位表示正負號。如下圖所示:


在編程語言中,計數往往是從0開始,例如字符串 "abc123",我們稱第 0 個字符是 a,第 1 個字符是 b,第 5 個字符是 3。這和我們平時從 1 開始計數的習慣不一樣,大家要慢慢適應,培養編程思維。

C語言規定,在符號位中,用 0 表示正數,用 1 表示負數。例如 int 類型的 -10 和 +16 在內存中的表示如下:


short、int 和 long 類型默認都是帶符號位的,符號位以外的內存才是數值位。如果只考慮正數,那么各種類型能表示的數值范圍(取值范圍)就比原來小了一半。

但是在很多情況下,我們非常確定某個數字只能是正數,比如班級學生的人數、字符串的長度、內存地址等,這個時候符號位就是多余的了,就不如刪掉符號位,把所有的位都用來存儲數值,這樣能表示的數值范圍更大(大一倍)。

C語言允許我們這樣做,如果不希望設置符號位,可以在數據類型前面加上 unsigned 關鍵字,例如:

unsigned short a = 12;
unsigned int b = 1002;
unsigned long c = 9892320;

這樣,short、int、long 中就沒有符號位了,所有的位都用來表示數值,正數的取值范圍更大了。這也意味著,使用了 unsigned 后只能表示正數,不能再表示負數了。

如果將一個數字分為符號和數值兩部分,那么不加 unsigned 的數字稱為有符號數,能表示正數和負數,加了 unsigned 的數字稱為無符號數,只能表示正數。

請讀者注意一個小細節,如果是unsigned int類型,那么可以省略 int ,只寫 unsigned,例如:

unsigned n = 100;

它等價于:

unsigned int n = 100;

無符號數的輸出

無符號數可以以八進制、十進制和十六進制的形式輸出,它們對應的格式控制符分別為:

 unsigned shortunsigned intunsigned long
八進制 %ho %o %lo
十進制 %hu %u %lu
十六進制 %hx 或者 %hX %x 或者 %X %lx 或者 %lX


上節我們也講到了不同進制形式的輸出,但是上節我們還沒有講到正負數,所以也沒有關心這一點,只是“籠統”地介紹了一遍。現在本節已經講到了正負數,那我們就再深入地說一下。

嚴格來說,格式控制符和整數的符號是緊密相關的,具體就是:

  • %d 以十進制形式輸出有符號數;
  • %u 以十進制形式輸出無符號數;
  • %o 以八進制形式輸出無符號數;
  • %x 以十六進制形式輸出無符號數。


那么,如何以八進制和十六進制形式輸出有符號數呢?很遺憾,printf 并不支持,也沒有對應的格式控制符。在實際開發中,也基本沒有“輸出負的八進制數或者十六進制數”這樣的需求,我想可能正是因為這一點,printf 才沒有提供對應的格式控制符。

下表全面地總結了不同類型的整數,以不同進制的形式輸出時對應的格式控制符(--表示沒有對應的格式控制符)。

 shortintlongunsigned shortunsigned intunsigned long
八進制 -- -- -- %ho %o %lo
十進制 %hd %d %ld %hu %u %lu
十六進制 -- -- -- %hx 或者 %hX %x 或者 %X %lx 或者 %lX


有讀者可能會問,上節我們也使用 %o 和 %x 來輸出有符號數了,為什么沒有發生錯誤呢?這是因為:

  • 當以有符號數的形式輸出時,printf 會讀取數字所占用的內存,并把最高位作為符號位,把剩下的內存作為數值位;
  • 當以無符號數的形式輸出時,printf 也會讀取數字所占用的內存,并把所有的內存都作為數值位對待。


對于一個有符號的正數,它的符號位是 0,當按照無符號數的形式讀取時,符號位就變成了數值位,但是該位恰好是 0 而不是 1,所以對數值不會產生影響,這就好比在一個數字前面加 0,有多少個 0 都不會影響數字的值。

如果對一個有符號的負數使用 %o 或者 %x 輸出,那么結果就會大相徑庭,讀者可以親試。

可以說,“有符號正數的最高位是 0”這個巧合才使得 %o 和 %x 輸出有符號數時不會出錯。

再次強調,不管是以 %o、%u、%x 輸出有符號數,還是以 %d 輸出無符號數,編譯器都不會報錯,只是對內存的解釋不同了。%o、%d、%u、%x 這些格式控制符不會關心數字在定義時到底是有符號的還是無符號的:

  • 你讓我輸出無符號數,那我在讀取內存時就不區分符號位和數值位了,我會把所有的內存都看做數值位;
  • 你讓我輸出有符號數,那我在讀取內存時會把最高位作為符號位,把剩下的內存作為數值位。


說得再直接一些,我管你在定義時是有符號數還是無符號數呢,我只關心內存,有符號數也可以按照無符號數輸出,無符號數也可以按照有符號數輸出,至于輸出結果對不對,那我就不管了,你自己承擔風險。

下面的代碼進行了全面的演示:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. short a = 0100; //八進制
  5. int b = -0x1; //十六進制
  6. long c = 720; //十進制
  7. unsigned short m = 0xffff; //十六進制
  8. unsigned int n = 0x80000000; //十六進制
  9. unsigned long p = 100; //十進制
  10. //以無符號的形式輸出有符號數
  11. printf("a=%#ho, b=%#x, c=%ld\n", a, b, c);
  12. //以有符號數的形式輸出無符號類型(只能以十進制形式輸出)
  13. printf("m=%hd, n=%d, p=%ld\n", m, n, p);
  14. return 0;
  15. }

運行結果:
a=0100, b=0xffffffff, c=720
m=-1, n=-2147483648, p=100

對于絕大多數初學者來說,b、m、n 的輸出結果看起來非常奇怪,甚至不能理解。按照一般的推理,b、m、n 這三個整數在內存中的存儲形式分別是:

當以 %x 輸出 b 時,結果應該是 0x80000001;當以 %hd、%d 輸出 m、n 時,結果應該分別是 -7fff、-0。但是實際的輸出結果和我們推理的結果卻大相徑庭,這是為什么呢?

注意,-7fff 是十六進制形式。%d 本來應該輸出十進制,這里只是為了看起來方便,才改為十六進制。

其實這跟整數在內存中的存儲形式以及讀取方式有關。b 是一個有符號的負數,它在內存中并不是像上圖演示的那樣存儲,而是要經過一定的轉換才能寫入內存;m、n 的內存雖然沒有錯誤,但是當以 %d 輸出時,并不是原樣輸出,而是有一個逆向的轉換過程(和存儲時的轉換過程恰好相反)。

也就是說,整數在寫入內存之前可能會發生轉換,在讀取時也可能會發生轉換,而我們沒有考慮這種轉換,所以才會導致推理錯誤。

上一篇:N76E003之SPI

下一篇:N76E003之IAP

聯系方式0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
6080国产精品| 国产九九在线视频| 亚洲天堂网2018| 蜜臀av免费观看| 日韩成人av免费| xxx国产在线观看| 九色porny自拍| 久久撸在线视频| 亚洲精品综合在线观看| 激情 小说 亚洲 图片: 伦| 国产成人手机视频| 日本黄色播放器| 粉嫩av一区二区三区天美传媒| 欧美精品久久久久久久久久久| 老太脱裤子让老头玩xxxxx| 国产一级片黄色| 天天操精品视频| 喜爱夜蒲2在线| av天堂永久资源网| www.日本久久| 精品久久久久久中文字幕2017| 久久久久国产精品熟女影院| 亚洲欧美国产中文| 国产精品裸体瑜伽视频| 久久久久久久久久久久久国产精品 | 亚洲精品免费一区亚洲精品免费精品一区| 日韩视频免费在线播放| 久久久久久久久久毛片| 国产69精品久久久久999小说| 激情视频综合网| 男女激烈动态图| 亚洲一二三不卡| 日本www在线视频| av磁力番号网| 97人人模人人爽人人澡| 精品久久一二三| 久久久精品视频国产| 男女高潮又爽又黄又无遮挡| 亚洲激情免费视频| 91蝌蚪视频在线观看| 久久视频免费在线| jizzzz日本| 少妇人妻在线视频| 小泽玛利亚av在线| √天堂资源在线| 一区二区三区 欧美| 97成人在线观看视频| 色哟哟免费网站| 99精品999| 天天干天天操天天玩| 少妇人妻无码专区视频| 99热一区二区三区| 中文字幕第22页| 五月婷婷之综合激情| jizzjizzxxxx| 日本午夜激情视频| 久久久性生活视频| 99热久久这里只有精品| 欧美成人精品免费| 午夜久久久久久久久久久| 在线观看亚洲色图| 在线观看国产一级片| 亚洲免费av一区二区三区| 成人免费在线小视频| 久久亚洲中文字幕无码| 黄网站欧美内射| 六月丁香激情网| 国内性生活视频| 无码无遮挡又大又爽又黄的视频| 欧美国产激情视频| 99福利在线观看| 热久久精品免费视频| 黄色三级视频在线| 五月天激情播播| 九九久久九九久久| 成人毛片一区二区| 久久久久狠狠高潮亚洲精品| wwwxxx黄色片| www激情五月| 欧美日韩dvd| 日日橹狠狠爱欧美超碰| 激情网站五月天| 手机av在线网| 久久人妻无码一区二区| 久久99久久99精品| 日韩av资源在线| 国产福利在线免费| 青春草国产视频| 亚洲第一中文av| wwwjizzjizzcom| aaaaaa亚洲| 欧美 日韩 国产 在线观看| 国产二区视频在线| 天天干天天玩天天操| www.日本在线视频| 五月婷婷激情久久| 乱熟女高潮一区二区在线| 密臀av一区二区三区| 久久久国产精华液999999 | 久久久久久久久久一区| 成人高清dvd| 邪恶网站在线观看| 天堂…中文在线最新版在线| 在线黄色免费观看| 777精品久无码人妻蜜桃| 中文字幕亚洲影院| 成人3d动漫一区二区三区| 欧美a级免费视频| 亚洲天堂av一区二区| 免费无遮挡无码永久视频| 最近中文字幕免费mv| 日韩av手机版| 久草资源站在线观看| 日本免费在线视频观看| 777视频在线| 一级特黄性色生活片| 成人黄色av片| 欧美午夜小视频| 17c丨国产丨精品视频| 亚洲欧美手机在线| 又色又爽又高潮免费视频国产| 欧美大黑帍在线播放| 日本一二三区在线| 久久久久久综合网| 九色porny自拍| 国产精品v日韩精品v在线观看| 久久国产乱子伦免费精品| 鲁一鲁一鲁一鲁一色| 亚洲人精品午夜射精日韩| 2019日韩中文字幕mv| 黄色一级片国产| 男人天堂a在线| 国产3p露脸普通话对白| 97干在线视频| 黄色免费观看视频网站| 成年人小视频网站| 一区二区三区免费播放| 亚欧美在线观看| 色中文字幕在线观看| 欧美性受xxxx黑人猛交88| 在线观看污视频| 亚洲国产精品成人天堂| 97成人在线观看视频| 亚洲色图 在线视频| 中文字幕日韩久久| 天堂а√在线中文在线| av高清在线免费观看| 日日碰狠狠丁香久燥| 三级一区二区三区| 欧美一级爱爱视频| 99精品视频在线看| 日本不卡一区二区在线观看| 亚洲综合123| 中文字幕无码精品亚洲资源网久久| 黄色av网址在线播放| 三上悠亚在线一区二区| 中文字幕第50页| 欧美xxxxx在线视频| 亚洲免费成人在线视频| 精品国偷自产一区二区三区| 国产精品沙发午睡系列| 亚洲激情在线看| 凹凸国产熟女精品视频| 亚洲一二三av| 久久精品一区二| 男人日女人的bb| 一起操在线视频| 无码人妻精品一区二区三区在线| 日本一二区免费| 黑森林福利视频导航| 色哟哟免费网站| 超碰在线人人爱| 国产精品后入内射日本在线观看| 天天操精品视频| 国产免费人做人爱午夜视频| 国产又粗又猛又爽又黄的网站 | 欧美精品成人网| 91九色丨porny丨国产jk| 五月天婷婷在线观看视频| 动漫av免费观看| 久久久久久久久久久视频| 裸体大乳女做爰69| 久久6免费视频| 亚洲另类第一页| 日日躁夜夜躁aaaabbbb| 777精品久无码人妻蜜桃| 欧美日韩午夜爽爽| 神马午夜伦理影院| www.-级毛片线天内射视视| 三上悠亚av一区二区三区| 国内外成人免费激情视频| 丁香花在线影院观看在线播放| 四虎4hu永久免费入口| 亚洲图片 自拍偷拍| 视频区 图片区 小说区| 亚洲第一天堂久久| 国产精品美女在线播放| 在线成人免费av| 久久国产精品免费观看| 亚洲第一页在线视频|