欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析unsigned int 和 int

 更新時間:2013年08月13日 10:01:37   作者:  
以下是對unsigned int和int進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下

就如同int a;一樣,int 也能被其它的修飾符修飾。除void類型外,基本數(shù)據(jù)類型之前都可以加各種類型修飾符,類型修飾符有如下四種:
1.signed----有符號,可修飾char、int。Int是默認(rèn)有符號的。
2.unsigned-----無符號,修飾int 、char
3.long------長型,修飾int 、double
4.short------短型,修飾int

我們主要來看一下signed和unsigned與int之間的聯(lián)系與區(qū)別。
什么叫做有符號,什么叫做無符號
這個問題其實很簡單,比如:5和-5,5沒有符號,-5有符號。簡單吧。但是在計算機中的這種符號可不簡單。我們分別來看一下:
在說明有符號和無符號的區(qū)別之前,我們必須先知道溢出是怎么回事,因為有無符號的根本原因可以說就是因為數(shù)據(jù)出現(xiàn)了溢出現(xiàn)象導(dǎo)致的。

溢出:
我們知道數(shù)據(jù)在計算機中以二進(jìn)制存儲,并且占據(jù)一定的空間,而這個空間屬于計算機分配的空間。
計算機給int分配32位或者16位(不同電腦可能不同)的空間,既然空間有限,那么數(shù)值就會有限制,就會存在最大值與最小值這一說,比如:假設(shè)int類型的分配16位,無符號類型的最大值為1111 1111 1111 1111(16個1),也就是65535,如果超過了65535,這就叫做溢出,那該怎么辦? 如果要輸出65536,那將會輸出個什么東西呢? 下面和大家一起看一下:

疑問:有的讀者會問:65535這么小啊,我記得自己在輸出比65535大好多的數(shù)也能夠輸出啊。
解答: 那就是有無符號的定義和你電腦編譯器的原因了。64位的電腦和32的電腦可是不一樣的哦。而且int占幾個字節(jié)是與電腦編譯器有關(guān)的。不過現(xiàn)在大部分電腦int占4個字節(jié),即32位,那么他的最大值可是32個1(二進(jìn)制)左右的數(shù)量級,你實驗過這么大的數(shù)嗎?

1.無符號整型(unsigned  int)
(1)我們都知道整型是4個字節(jié)(有些編譯器不同,可能會是2個),即32位,無符號整型當(dāng)然也為32位。
(2)既然是32位,無符號整型的取值是32個0~32個1,即:0~4294967295
(3) 我們舉個例子:32位有點長,所以我們拿16位的unsigned short int 來舉例。
short int 是16位的,無符號的范圍是0~65535
就拿十進(jìn)制的32767(以下的所有舉例均拿這個數(shù)字來說事了)來說,它的二進(jìn)制為:
               0111 1111 1111 1111
對于無符號的整型32767來說,它的二進(jìn)制的最高位稱為數(shù)據(jù)位,即那個0就是數(shù)據(jù)位,數(shù)據(jù)位是要參與運算的,如果我們把0改成1,即16個1,它的十進(jìn)制就是65535(就是2的15次方+2的14次方...一直加到2的0次方),這是不同于有符號整型的。
(4) 為了進(jìn)行理解(3)中的含義,做一個程序說明:

復(fù)制代碼 代碼如下:

#include <stdio.h>
main()
{
    unsigned short int a=32767,b=a+1;//定義短整型無符號
    printf("a=%u\nb=%u\n",a,b);//以無符號輸出
}




定義的時候a=32767,也就是0111 1111 1111 1111,輸出的依然是32767,
a+1=32768, 二進(jìn)制為1000 0000 0000 0000,輸入依然為32768。
根據(jù)(3)中講解的,無符號整型的二進(jìn)制最高位為數(shù)據(jù)位,數(shù)據(jù)位為0為1都是按照正常來算的。

2.有符號整型((signed)int)(1)int類型默認(rèn)是有符號的,所以int實際上是signed int ,我們通常省略signed
(2)有符號整型也是32位。
(3)它的取值范圍就與無符號整型不同了。它的范圍是-2147483648~2147483647這個范圍可以理解為無符號整型的一半變成了負(fù)數(shù)。

32位有點長,所以我們拿16位的short int 來舉例。
short int 是16位的,有符號的范圍是-32768~32767

這個時候可能就有人發(fā)問了,32768用二進(jìn)制表示為1000 0000 0000 0000,那么這個負(fù)的32768的負(fù)號又怎么理解呢?看下面
(4)舉個例子;
還是以32767為例子,它的二進(jìn)制為:
      0111 1111 1111 1111
對于有符號整型32767來說,它的二進(jìn)制最高位稱為符號位(而不是數(shù)據(jù)位了),符號位顧名思義就是決定正負(fù)號的,規(guī)則:0是正,1為負(fù)。
(5)列舉一個程序理解(4)的內(nèi)容

復(fù)制代碼 代碼如下:

#include <stdio.h>
main()
{
   short int a=32767,b,c,d;//定義無符號類型。
b=a+1;
c=a+2;
d=a+3;
   printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}

可以看出此時的結(jié)果竟然是這個樣子的。為什么呢?怎么回事?
其實在計算機中,負(fù)數(shù)是并不存在的,它是以二進(jìn)制補碼的形式表示和存放。什么是補碼呢?

(6)什么是補碼,補碼的運算。
我們還是列舉一個簡單的例子吧!就用-6.

我們經(jīng)過以上的學(xué)習(xí)已經(jīng)知道負(fù)數(shù)的符號位為1,所以:
 (1)-6的二進(jìn)制: 1000 0000 0000 0110(稱為原碼,原碼是計算機顯示給我的)
 (2)對原碼求反碼:1111 1111 1111 1001(稱為反碼,保持符號位不變,將原碼中的0變1,1變0)
 (3)對反碼加1:1111 1111 1111 1010(稱為補碼,補碼是計算機中存儲負(fù)數(shù)的形式)
在計算機中,如果存儲的二進(jìn)制是1111 1111 1111 1010,那么顯示在我們前臺的十進(jìn)制數(shù)字就是-6。即:負(fù)數(shù)在計算機中是以該負(fù)數(shù)的二進(jìn)制的補碼形式存儲的。

(7)了解了什么是補碼后,再來看我們上述說的那個程序:
  32767的二進(jìn)制為:0111 1111 1111 1111
我們來計算一下c的值為什么會等于-32767。
c=32767+2,c的二進(jìn)制為:1000 0000 0000 0001(32767的二進(jìn)制+2),c的這個二進(jìn)制是在計算機中存儲的補碼,需要將它轉(zhuǎn)換為原碼,也就是將c的二進(jìn)制數(shù)減一再取反。得到的二進(jìn)制原碼為:1111 1111 1111 1111。我們已經(jīng)說過,符號位為1,表示負(fù)值,并不參加運算,所以此二進(jìn)制的十進(jìn)制為:-32767。
但是,上述中,c的原碼的確是1111 1111 1111 1111,c在計算機中存儲的補碼也的確是1000 0000 0000 00010。但是-32767的由來卻有另一種理解,c的補碼是16位,32位編譯器中有32位的二進(jìn)制,也就是說在16位補碼的前面還有(32-16=16)位的虛位數(shù),并不屬于計算機給short int分配的空間,但是這16位的位數(shù)當(dāng)數(shù)表示正時為0,當(dāng)數(shù)表示負(fù)數(shù)時為1。并且前16位的數(shù)字全部都與二進(jìn)制倒數(shù)第8位的數(shù)字一致。也就是說:
  c 的補碼是   1...1 1000 0000 0000 0010(1..1表示16個1)
我們可以這樣計算:-2的7次方+2的1次方=-32767,這種理解普遍被大眾所接受,而且避免了原碼的概念。

(8)通過程序也可以發(fā)現(xiàn)一個規(guī)律,int的取值范圍是-32768~32767,把頭尾連接起來形成一個環(huán)就可以了。

相關(guān)文章

  • 使用matlab繪制七夕表白玫瑰花束

    使用matlab繪制七夕表白玫瑰花束

    又是一年七夕節(jié)要到了,每年一次直男審美MATLAB繪圖大賽開始了,于是今年對我之前寫的老代碼進(jìn)行了點優(yōu)化組合,整了個花球變花束,感興趣的小伙伴可以動手試一試
    2023-08-08
  • 講解C++中的枚舉類型以及聲明新類型的方法

    講解C++中的枚舉類型以及聲明新類型的方法

    這篇文章主要介紹了講解C++中的枚舉類型以及聲明新類型的方法,是C預(yù)言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言遞歸思想實現(xiàn)漢諾塔詳解

    C語言遞歸思想實現(xiàn)漢諾塔詳解

    大家好,本篇文章主要講的是C語言遞歸思想實現(xiàn)漢諾塔詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言中關(guān)于scanf讀取緩存區(qū)的問題

    C語言中關(guān)于scanf讀取緩存區(qū)的問題

    scanf()函數(shù)是通用終端格式化輸入函數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤) 讀取輸入的信息,接下來通過本文給大家介紹C語言中關(guān)于scanf讀取緩存區(qū)的問題,需要的朋友一起看看吧
    2021-09-09
  • C++之set自定義排序問題

    C++之set自定義排序問題

    這篇文章主要介紹了C++之set自定義排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • c++快速排序詳解

    c++快速排序詳解

    快速排序總體思想:先找到一個樞軸,讓他作為分水嶺。通過一趟排序?qū)⒋判虻挠涗浄指畛瑟毩⒌膬刹糠?,前面一部分都比樞軸小,后面一部分逗比樞軸大,然后又分別對這兩部分記錄繼續(xù)進(jìn)行遞歸的排序,達(dá)到整個序列有序的目的。
    2017-05-05
  • C語言中用于產(chǎn)生隨機數(shù)的函數(shù)使用方法總結(jié)

    C語言中用于產(chǎn)生隨機數(shù)的函數(shù)使用方法總結(jié)

    這篇文章主要介紹了C語言中用于產(chǎn)生隨機數(shù)的函數(shù)使用方法總結(jié),分別介紹了rand()函數(shù)和srand()函數(shù)以及封裝出的arc4random()函數(shù),需要的朋友可以參考下
    2016-05-05
  • c++ 形狀類Shape(派生出圓類Circle和矩形類Rectangle)

    c++ 形狀類Shape(派生出圓類Circle和矩形類Rectangle)

    通過C++方式,建立一個形狀類Shape作為基類,派生出圓類Circle和矩形類Rectangle 求出面積并獲取相關(guān)信息
    2020-11-11
  • Qt中const?QString轉(zhuǎn)換?char?*可能的坑

    Qt中const?QString轉(zhuǎn)換?char?*可能的坑

    本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 深度剖析C++中的異常機制

    深度剖析C++中的異常機制

    異常是面向?qū)ο笳Z言常用的一種處理錯誤的方式,當(dāng)一個函數(shù)發(fā)現(xiàn)自己無法處理的錯誤時就可以拋出異常,本文我們將對C++ 異常機制進(jìn)行深入剖析,感興趣的同學(xué)跟著小編一起來看看吧
    2023-07-07

最新評論