2014-03-27 31 views
0

我有一個存儲在short int中的值,只有在用小數點表示爲十六進制數字時纔有意義。爲了舉例說明:如果short int包含1132十進制(534h),那麼我需要輸出「5.34」。價值來自公司共享庫中隱藏的功能,所以我必須接受我所得到的。結果不需要是數字類型(int或float);相反,它可以是任何類型的(例如字符串),我可以將它們輸入到標準輸出流中。如何在一個整數的十六進制表示中放置小數點?

short int中的給定值始終是這樣的,當以十六進制數字表示時,所有數字都將在0-9範圍內(從不是A-F)。總是應該有兩位小數。

我知道我可以用std::hex代表十進制數字作爲十六進制數字,用std::out輸出「534」,但我不知道如何將這些單獨的數字(5,3,4)存儲在內存中,這樣我可以插入一個.在他們。

一旦我得到十六進制數字,我應該將一組十六進制數字轉換爲一個字符串,並將小數點從右邊三個字符?或者更容易以某種方式轉換爲浮點格式併除以100(64h)?

回答

2
int dodgy(char* buf, unsigned input) { 
    return sprintf(buf, "%x.%02x", input/256, input&0xff); 
} 
string dodgy2(unsigned input) { 
    char buf[(CHAR_BIT * sizeof input + 11)/4]; 
    dodgy(buf, input); 
    return string(buf); 
} 
+0

你能解釋你的緩衝區大小計算嗎? –

+0

容易。 'input'具有'sizeof input'字節,一個字節具有'CHAR_BIT'位,4位用於整個十六進制數字,但不能保證'CHAR_BIT * sizeof input'可以被4除盡,因此首先加3(標準unsigned int算術舍入)。現在我們需要1個字符作爲'.',一個用於'\ 0',所以再加兩個字節。 – Deduplicator

+0

@Cerran:您的意思是每個4位(16個可能值),總共8位(256個可能的值)。 – Deduplicator

2

十六進制是一種打印表示形式,不是值類型。這聽起來像BCD,在這種情況下,這一切都是有道理的。您只需將其轉換爲十進制,半字節即一次4位,並在最後兩位數字前插入小數點。有很多BDC到ASCII碼的代碼,並不難搞清楚你自己。重要的是要弄清楚它實際上是什麼。

+0

執行了一些位移後,我可以確認它是BCD。謝謝你的提示;我腦海中並沒有立即想到BCD。 – Cerran

+0

AFAICT,它只能打印一次,沒有任何其他方式處理,因此不需要轉換爲標準格式。不過,最好還是知道它是什麼,以及如何在一般情況下進行轉化。我應該記住BCD,但它有點不尋常...... – Deduplicator

相關問題