記憶體儲存相關的一些易錯題

2021-10-18 16:35:05 字數 2511 閱讀 8676

1.對於以下**輸出結果是什麼?

//輸出什麼?

#include

intmain()

char型別一定是有符號的,因此第乙個會輸出-1。

signed char 表示的是有符號的char,同樣會輸出-1。

而最容易混淆的是unsigned char ,這是乙個無符號的char,給它賦值-1會輸出什麼。我來詳細解釋一下,-1在記憶體中一定是按照補碼儲存的,-1的補碼是32個1。

也就是11111111111111111111111111111111,但是char型別的記憶體大小只有乙個位元組,也就是只能放8位,因此會產生截斷。

而在列印的時候要用整形列印,這就涉及到c語言的整型提公升的問題,不懂的可以在我的另一篇文章看一下。大概意思就是整型提公升會按照符號位來補足缺失的位數,但是此時的c是無符號的,因此預設符號位是0。因此列印的時候c會變成下圖所示:

此時按照整形列印,就是255。

**這裡有同學可能會質疑這個題目,char不是用來存放字元的嗎?怎麼還能存放-1。這裡我解釋一下,char用來存放字元肯定是沒錯的,但是char本身是整形,也是可以用來存放-1的,並且是用%d列印的,並沒有用%c輸出,也是合情合理的。

**2.下面**的輸出結果是什麼?

#include

intmain()

a是乙個char型別,是有符號的。

經過如上的變換之後,%u列印出來的是最後的32位,也就是

4,294,967,168。

3.對於下面的**,輸出是什麼?

#include

intmain()

a同樣是有符號的char

結果依然是4,294,967,168。

4.下面的迴圈會輸出什麼?

unsigned

int i;

for(i =

9; i >=

0; i--

)

會不會輸出9、8、7、6、5、4、3、2、1、0呢?

答案當然是不會的。其中的關鍵在於i是乙個無符號整形。

i不可能是負數,那麼0之後i是多少呢?

unsigned int 的範圍是0-4294967295,在迴圈中,i=0之後不會輸出-1.而是越過上圖的分界線,變成4294967295,然後再不斷減少,不斷重複,變成乙個死迴圈。我們看一下**結果驗證一下:

5.有如下迴圈,輸出的結果是什麼?

unsigned

char i =0;

intmain()

return0;

}

在算這道題之前,要了解char和unsigned char的範圍都是多少。

對於有符號的char,最高位是符號位,有效位只有7位

所有的數都是補碼形式,char型別的範圍是-128–127;而unsigned char 是沒有符號位的,因此最高位也是有效位,其範圍是0-255。

知道了這些,上面的題就很好計算了。由於i是無符號的char,在i=255之後又會變成0,無限迴圈下去。

6.如下**會輸出什麼?

int

main()

printf

("%d"

,strlen

(a))

;return0;

}

看到這道題,有的人可能覺得是個隨機數,因為strlen找不到』\0』,但是這道題的答案卻不是這樣滴。

雖然陣列是用char定義的,但是i卻是乙個整型變數,這就這道題最大的坑,存在char陣列中的數是整型變數i截斷之後的數,存入陣列中的均為有效位,所以最開始a[1]=11111111=255,不斷減少,減到第255個數的時候就會出現0。而ascii碼值0對應的是』\0』,因此輸出的長度是255,而不是隨機數。

這道題其實可以這樣理解,本身char是有符號的,但是由於是用整型變數i截斷後傳進去的,相當於變成無符號的char,這樣想可能更好理解一些。

前端一些易錯題總結

const 可以先宣告後賦值麼?const a 答 不可以,會報錯uncaught syntaxerror missing initializer in const declaration let 可以先使用後宣告麼?console.log a let a 12 答 不可以,uncaught ref...

C語言 關於資料在記憶體中的儲存易錯題(3)

1.輸出什麼?includeint main 結果 4294967168 十六進製制 0x ff ff ff 80 分析 首先寫出 128 10000000 00000000 00000000 10000000 原碼 11111111 11111111 11111111 01111111 反碼 11...

Haswell 事務記憶體相關的一些資源介紹

事務記憶體tm transactional memory 是herlihy和moss於1993年在isca會議上提出的一種基於硬體實現的無鎖同步機制。該機制基於smp結構,通過增加事務cache,並修改 cache一致性協議來實現。事務記憶體不僅避免了傳統鎖機制帶來的一系列問題,增強了執行緒間的並行...