目錄
1.問題引入
2.字符型變量的存儲
3.字符型變量的取值
4.字符型變量中的-128
5.取值轉換圖
? 我們知道,在C語言中,一個字符型數據占8個bit位,那么當我們定義一個字符型數據,我們需要給它賦上什么范圍的值才合適呢。是[-127,127],還是[-128,127],亦或者是[-127,128]?下面就讓我們進入本篇文章的內容:字符型變量的存儲和取值。
2.字符型變量的存儲將字符變量存儲到內存中中,實際上并不是把該字符本身放到內存單元中去,而是將該字符的相應的ASCII 碼放到內存中。因此它的存儲形式就與整數的存儲形式類似。不同的是,字符型數據占8個bit位,而整形數據占32個bit位,比特位的位數不同也就說明著它們的取值范圍不同,如果對字符型數據的賦值超過了所能表示的范圍,則數據將會發生截斷,導致出錯。例如:
我們定義一個字符數據
char c=10;
由于在計算機中數據是以二進制補碼的形式存放,所以我們將整數10轉化為二進制補碼,然后取前8位放入c中進行存放,對應圖解如下:
而如果我們定義了
char c=129 ;
那么其對應的存放圖解如下:?
我們可以發現,此時c的最終結果并不是129而是-127,說明129超出了字符型變量的表示范圍,所以導致數據的存儲出現了錯誤。
3.字符型變量的取值? 在將取值之前,先拋出一句我認為說得很好的一句話:
計算機所謂的特定數據類型能表示多少范圍數據,取決于多少比特位的排列組合,比如4個比特位就一定可以表示2^4個數據,計算機絕對不會浪費任何一種組合。
? 根據這句話我們就可以先斷定,一個字符型變量一定可以表示2^8,也就是256個數據。我們先按照符號位對字符型變量進行如下拆分:
按照以上分析,那么我們字符型變量的取值范圍就是[-127,127]嗎,實則不然。細心的小伙伴可能會發現,無論是上面還是下面,都有0這個數據的表示方式,分別為0000 0000和1000 0000;而在計算機中,我們當然不能讓0有兩種表示方式,否則會引起歧義。因此我們將0000 0000來表示0。而前面我們說過,計算機絕對不會浪費任何一種組合,所以,我們還需對1000 0000進行定義,賦予其意義。
我們不妨先來猜猜,1000 0000要表示什么呢?由于數據的取值范圍肯定是連續的最好,所以我們可以在128和-128進行選取,又由于1000 0000最高位即符號位為1,所以我們猜測1000 0000代表-128。則字符型數據的表示范圍就是[-128,127]。
4.字符型變量中的-128? 那么,為什么在字符型變量1000 0000代表-128呢?我們依舊來分析一下如下語句:
char c=-128;
我們知道,當我們定義了一個變量c時,編譯器對c分配了8個bit位的內存空間,但是對于-128,它一開始并不是在變量c的內存空間中,是在寄存器中,需要先轉化為二進制后,才能放入c中,因此我們可以得到以下圖解:
? 我們可以發現,十分巧合的是,當-128在寄存器中轉化為二進制補碼后,截斷存入c中時,存放的數據正是1000 0000,也就是我們上述所猜想的那樣。?
那如果我們將此時c中存放的1000 0000取出來,會不會還是-128呢?遺憾的是,由于數據發生的截斷,所以無法正確的轉化回來。具體過程如下:
5.取值轉換圖顯然,最后轉化后的原碼并不是-128。所以我們可以說在字符型數據中1000 0000表示-128是一種半計算半規定的方式。因此以后我們在字符型變量中看到1000 0000,不必再進行轉化,可以將其直接看成-128。
? 綜上,我們可以得出一個8bit位的char類型變量所能表示的范圍是[-128,127].如果超出了這個范圍,就會發生截斷,產生錯誤。根據以下轉換圖我們可以輕松得出截斷后的數字:
例如以下兩個例子
char c=128;
char c=-129;
對于例1,因為128=127+1,根據順時針方向為正方向,則c最后的值就為127下一個數字-128?。
對于例2,因為-129=-128-1,所以需要取-128負方向也就是逆時針方向的下一個數字,則c最后的值就是127。
以上,就是本期的全部內容。
制作不易,能否點個贊再走呢qwq
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站欄目:字符型變量的存儲和取值-創新互聯
鏈接URL:http://www.yijiale78.com/article32/dopisc.html
成都網站建設公司_創新互聯,為您提供軟件開發、響應式網站、Google、網站策劃、企業建站、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯