為什麼C語言用printf 列印數值的十進位制 八進位制 十六進製制時,有時會擴充套件到32位有時不會?

時間 2021-12-29 20:00:16

1樓:暮無井見鈴

傳遞引數給省略號形參時,會經過

整型提公升(對於 char、 short 等「短於 int 」的型別,如果能轉換到 int 且值不改變則轉換到 int ,否則轉換到 unsigned int )、

浮點提公升( float 轉換到 double )(問題裡的程式不涉及)。

這裡程式存在未定義行為。因為 fprintf 系列函式的格式字串所用的 o、 x、 X 或 u 格式說明符在沒有長度修飾符時,對應的實參型別必須是 unsigned int 。

實現上遇到這種情況時,基本都是把 int 型別實參的位模式(物件表示)當成 unsigned int 來讀。

從而在 int 為 32 位的平台上,按 o、 x、 X 或 u 格式說明符列印負的 int 引數時就像是把整個 32 位補碼表示分別用八進位制、十六進製制或十進位制寫出來。使用正確的 d 格式說明符列印時就能正確列印負值。

printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s

如果需要按問題裡的程式期望(暫且假設如此……)的「把負數的表示擴充套件到 int 寬度」,可以先把它顯式轉型成 unsigned int ,然後無符號整數型別的格式說明符列印,譬如寫 printf("c的八進位制:%o\n", (unsigned int)c) 。

題外話: C23 起移除了原碼、反碼表示的支援,僅允許有符號整數使用補碼表示,並且規範化了有符號/無符號整數型別的物件表示所使用的位。從而我認為 va_arg 中關於有符號/無符號整數取值的限制及 fprintf 函式在部分有符號/無符號整數型別間的限制變得不再必要了,有可能未來標準版本(包括現在發展中的 C23)中問題裡的程式不會再有未定義行為。

2樓:CLOWN

除了十進位制是帶正負號的之外, 其他進製都是直接輸出帶符號位的二進位制形式的.

輸出時前導0會忽略, 但是前導1不會.

在計算機中, 整型的底層使用補碼表示.

進行移位運算時使用的是算術右移

熟悉上面2個概念後我們來看一道經典的面試題#include

intmain

()已知char型的取值範圍是-128~127a, b, c的二進位制表示分別是.

01000000 10000000 11000000所以結果為

64 -128 -64

3樓:zkl1001

b的八進位制:201

b的十進位制:129

b的十六進製制:81

應該這樣理解

b的八進位制:00000000201

b的十進位制:0000...(N個)0129b的十六進製制:00000081

所以意思是說都是32位的輸出,只不過前導0被printf省略了

用printf將int值按float列印為什麼結果會變為0?

hsldymq x86的架構,union中int和float共用乙個32位的儲存空間 你把給int賦的值轉換為二進位制,這個值也就是float的值,然後自己用IEEE754標準計算一下是多少你就知道了,如果你不懂IEEE754和移碼,查查資料,就當拓展知識面了 劉項 0001 0010 0011 0...

C語言怎麼輸出這個,不要全是printf,急急急 感謝?

黃亮anthony 程式,首先是一種數學思維,如何用數學來表示要求的結果。本題,以及類似的題型,都可以看成乙個座標系下的圖形輸出,每乙個要顯示的點 x,y 滿足方程y f x 上圖顯然是乙個左右對稱的圖形,把座標系y軸放在中間可以得到比較簡單的方程,比如中間直線就是 x 0,0 y 5,左右直線斜率...

學習c語言用什麼軟體?

WangKX visual studio 2019 community,跟上步伐學這個最新的。不懂看 c 新經典 裡面有詳細安裝步驟 除錯方法介紹。 cpp程式設計 這些都是比較常用的 1 visual c 6.0 win8系統下不好用,C C Mi crosoft Visual C 這個編譯器已經...