2013-06-29 28 views
0

我需要對32位整數進行bitewise操作(確實是represent chars,但無論如何)。比較(uint32_t)和硬編碼值是否安全?

以下代碼是否安全?

uint32_t input; 
input = ...; 

if(input & 0x03000000) { 
    output = 0x40000000; 
    output |= (input & 0xFC000000) >> 2; 

我的意思是,在「如果」的聲明,我做的按位操作上,在左側,一個uint32_t的,並在右邊...我不知道!

那麼你是否知道硬編碼的「0x03000000」的類型和大小(我的意思是它存儲了多少字節)?

是否有可能某些系統認爲0x03000000是一個int,因此只能在2個字節上編碼,這將是災難性的?

+1

看起來完全正常我。 –

+1

將右側提升爲它所適合的最小整數類型(如果它比'int'短,則爲'int'),因此比較是安全的。 – 2013-06-29 11:26:23

+0

1.您可以隨時將其轉換爲您需要的內容:'(uint32_t)0x03000000'。 2.你應該使這些'#define'清晰並且重複使用。您也可以添加演員陣列:'#define MYBITS(uint32_t)0x03000000'。 – 2013-06-29 14:18:36

回答

1

以下代碼是否安全?

是的。

那麼你知道硬編碼「0x03000000」的類型和大小(通過我的意思是存儲多少字節)?

0x03000000int的系統上32-bit的系統上intlong16-bitint

(如uint32_t存在這裏我想補和8CHAR_BIT。此外,我不知道有16-bitint64-bitlong任何系統。)

有沒有可能是某些系統考慮0x03000000作爲一個int,因此只能在2個字節上編碼,這將是災難性的?

見上文一個16-bitint系統上,0x03000000long和是32-bit。 C中的十六進制常數是第一類型的,其中它可以被表示爲: intunsigned intlongunsigned longlong longunsigned long long

+0

好的,但如果我使用0x00000001呢?在16位系統上,它將被表示爲一個16位整數。然後,我將在32位uint32_t和16位0x00000001之間執行bitewise操作。會拋出一個錯誤還是可以嗎? – KrisWebDev

+2

'0x00000001'保證是一個'int'。在使用'uint32_t'的按位表達式中,常量將被提升爲'uint32_t',所以沒問題。 – ouah

+0

@ouah:我認爲在'int'爲64位寬的平臺上,雙方都會被轉換爲'int'。 –