?在學習C語言的時候偶爾看到了一個這樣的代碼,unsigned int a=-10;乍一眼看上去這不就是錯的嗎?一個負數(shù)怎么能夠放到一個無符號整形里面去。如果你這樣想,那你就有必要看看我這篇文章了。
?首先我們需要了解一個數(shù)據(jù)是怎么存儲的,就比如說需要存儲這個-10,首先就需要創(chuàng)建一個變量a,創(chuàng)建變量a,需要在棧區(qū)開辟一塊內(nèi)存空間,而因為計算機只認識二進制的數(shù)據(jù),所以這個-10需要先轉換成二進制的形式,換句話說,在數(shù)據(jù)存儲到內(nèi)存之前數(shù)據(jù)自身就已經(jīng)準備好了存放到內(nèi)存所需要的格式了,所以數(shù)據(jù)存儲根本就不關心把數(shù)據(jù)存到的那個變量的類型是什么,反正我就準備好了一個二進制的補碼給你,你給我存進去,你是什么類型根本就不影響我這個數(shù)據(jù)的內(nèi)容,因為在放進內(nèi)存之前我就已經(jīng)準備好了,那如果這樣說的話,這個unsigned int 類型在這里有什么意義呢?為什么還要寫這個類型呢?
?雖然這個unsigned int 在數(shù)據(jù)存進去的時候沒有什么作用,但是它肯定有自己的作用的,它的作用其實體現(xiàn)在取出數(shù)據(jù)的時候,當你的變量是signed int類型的時候,編譯器會把內(nèi)存中的這個數(shù)據(jù)當作有符號數(shù)處理,即取出的時候會按照原碼,反碼,補碼的規(guī)則把這個補碼轉化成原碼,(原碼,反碼,補碼的轉換規(guī)則在文章結尾)得到的就是原碼就是1000 0000 0000 0000 ...1010,其中第一位看作符號位,1表示這個數(shù)是負數(shù),所以取出來的數(shù)就是-10,而如果你的變量是ungigned int 類型的時候,那么編譯器就會把內(nèi)存中的這個補碼看成是無符號的,即第一位也看成是有效位,而且無符號數(shù)的原碼,反碼,補碼是一樣的,所以翻譯出來的原碼是1111 1111 1111 1111 ...? 1111 0110了,所以取出來的數(shù)是4294967286。
? 總結:
? 變量存的過程:
? 字面數(shù)據(jù)必須先轉成補碼,再放入空間當中,所以,所謂符號位,完全看數(shù)據(jù)本身是否攜帶+-號,和變量是否有符號無關。
? 變量取的過程:
? 取數(shù)據(jù)一定要先看變量本身類型,然后才決定要不要看最高符號位,如果不需要,直接二進制轉成十進制,如果需要,則需要轉成原碼,然后才能識別。(當然符號位在哪里,又要明確大小端)
?所以unsigned int a=-10這種寫法并沒有錯誤。你學會了嗎?
補充:
原碼,反碼,補碼轉換規(guī)則:
正數(shù)和無符號數(shù)的原碼,反碼,補碼是一樣的,無需轉換。而負數(shù)需要轉換。
原碼>反碼>補碼
原碼的符號位不變,其他位按位取反得到反碼,反碼加一得到補碼。
補碼>原碼
方法一:補碼減一,再符號位不變,其他位按位取反得到原碼。
方法二:補碼再做一遍從原碼變成補碼的步驟,即補碼的符號位不變,其他位按位取反(需要注意的是這里得到的結果并不是反碼),得到的結果加一也能得到原碼。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:C語言中unsignedinta=-10,這種寫法是否正確?-創(chuàng)新互聯(lián)
瀏覽路徑:http://aaarwkj.com/article12/ccpddc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、定制開發(fā)、搜索引擎優(yōu)化、企業(yè)建站、面包屑導航、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)