c語言中int(2byte)的表示範圍是為什麼是-32768~32767!

來源:互聯網
上載者:User

1.這得從二進位的原碼說起(數字邏輯--東野老師): 
如果以最高位為符號位,二進位原碼最大為0111111111111111=2的15次方減1=32767 
最小為1111111111111111=-2的15次方減1=-32767 
此時0有兩種表示方法,即正0和負0:0000000000000000=1000000000000000=0 
所以,二進位原碼錶示時,範圍是-32767~-0和0~32767,因為有兩個零的存在,所以不同的數值個數一共只有2的16次方減1個,比16位二進位能夠提供的2的16次方個編碼少1個。 
但是電腦中採用二進位補碼儲存資料,即正數編碼不變,從0000000000000000到0111111111111111依舊錶示0到32767,而負數需要把除符號位以後的部分取反加1,即-32767的補碼為1000000000000001。 
到此,再來看原碼的正0和負0:0000000000000000和1000000000000000,補碼錶示中,前者的補碼還是0000000000000000,後者經過非符號位取反加1後,同樣變成了0000000000000000,也就是正0和負0在補碼系統中的編碼是一樣的。但是,我們知道,16位位元可以表示2的16次方個編碼,而在補碼中零的編碼只有一個,也就是補碼中會比原碼多一個編碼出來,這個編碼就是1000000000000000,因為任何一個原碼都不可能在轉成補碼時變成1000000000000000。所以,人為規定1000000000000000這個補碼編碼為-32768。 
所以,補碼系統中,範圍是-32768~32767。 
因此,實際上,二進位的最小數確實是1111111111111111,只是二進位補碼的最小值才是100000000000001,而補碼的1111111111111111是十進位值的-1。

{另外:補碼向原碼的轉換過程是:正數不變,負數保留符號位的1,其它位取反加一.

       補碼的計算方式是1.其符號位與數值部分一起參加運算。
                         2.補碼的符號位相加後,如果有進位出現,要把這個進位捨去(自然丟失)。
                         3.用補碼運算,其運算結果亦為補碼。在轉換為真值時,若符號位為0,數位不變;若符號位為1,應將結果求補才是其真值。}

 

2.下面說個codeforces上當疼的問題,以前沒有注意到:

long long intNum=-2147483648;<br />那麼我們cout<<intNum; 的時候是2147483648,<br />為什麼呢?<br />因為有的編譯器把2147483648視為(int)型<br />所以你要這樣定義:<br />long long intNum=-(long long)2147483648;<br />那麼cout<<intNum;的時候就是-2147483648了. 

3.還有一個編譯時間候warning的問題:

   "warning: this decimal constant is unsigned only in ISO C90"

注意:c語言裡面的常量預設是一個32位的有符號整型數。

解決方案:

1  在常數後面增加一個UL標識,或者ULL表示,如4294967295UL,這樣就不會警示了
2 使用十六進位的數字,如0xFFFFFFFF
3 使用gcc -std=c99 用99標準來編譯

原文:

The C90 rule that the default type of a decimal integer constant is either int, long, or unsigned long, depending on which type is large enough to hold the value without overflow, simplifies the use of constants. The choices in C99 are int, long and long long. C89 added the suffixes U and u to specify unsigned numbers. C99 adds LL to specify long long. Unlike decimal constants, octal and hexadecimal constants too large to be ints are typed as unsigned int if within range of that type, since it is more likely that they represent bit patterns or masks, which are generally best treated as unsigned, rather than “real” numbers. Little support was expressed for the old practice of permitting the digits 8 and 9 in an octal constant, so it was dropped in C89.A proposal to add binary constants was rejected due to lack of precedent and insufficient utility.Despite a concern that a “lower-case-l” could be taken for the numeral one at the end of anumeric literal, the C89 Committee rejected proposals to remove this usage, primarily on thegrounds of sanctioning existing practice.

搞明白了吧,出現這個警示,其實也是gcc提醒你該升級你的編譯選項了。不過最安全的還是使用十六進位,或者加上UL或者ULL這樣的說明。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.