C語言基礎

在嵌入式程式中,存放32位元周邊暫存器值的變數,常以 stdint.h 的 uint32_t 宣告,而不是 unsigned int。主要理由為下列何者?

  1. Auint32_t 的值超過最大值時不會回到0,而是停在最大值(飽和)
  2. B以 uint32_t 宣告的變數,讀寫不會被編譯器的最佳化省略
  3. Cunsigned int 的大小因處理系統而異,而 uint32_t 規定為剛好32位元的無號整數
查看答案與解析

正確答案:C. unsigned int 的大小因處理系統而異,而 uint32_t 規定為剛好32位元的無號整數

stdint.h 的 uint8_t、uint16_t、uint32_t、int32_t 等,是位元數如名稱所示固定的整數型別(固定寬度整數型別)。unsigned int 可能是16位元也可能是32位元,因此在需要配合暫存器寬度,或要決定通訊資料格式的場合使用固定寬度的型別,即使移植到其他CPU,意義也不會改變。uint32_t 與其他無號整數型別一樣,溢位時會成為除以 2³² 的餘數。若要讓讀寫不被省略,需在型別之外另外加上 volatile。

  • A. 無號整數型別溢位時會回到0的一側。要停在最大值,必須自行撰寫飽和的處理。
  • B. 讓讀寫不被省略是 volatile 的作用,與 uint32_t 這個型別無關。
  • C. 正確。在任何處理系統中都能以相同的32位元寬度處理。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 執行上方含有整數除法的程式碼時的輸出,下列何者正確?
  2. 執行上方使用前置與後置 ++ 的程式碼時的輸出,下列何者正確?
  3. 執行上方在 if 敘述的條件中寫了 = 的程式碼時的輸出,下列何者正確?
  4. 為了檢查暫存器值 reg 的位元2是否為1,寫了上方的程式碼。執行時的結果,下列何者正確?
  5. uint8_t 是8位元的無號整數型別。執行上方程式碼時的輸出,下列何者正確?