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 這個編譯器已經...