我想確定我明白如果兩個不同寬度的整數與彼此按位或運算會發生什麼情況。最明智的選擇是用零填充較小的一個。我寫了一個小程序來測試這個。在C中定義的不同int寬度上的按位運算符是否已定義好?
看看這個示例代碼:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
uint32_t foo = 0x00000000;
uint8_t bar = 0xFF;
printf("%"PRIu32"\n", (foo | bar));
printf("%"PRIu32"\n", (bar | foo));
}
如果我的猜測是正確的,我應該會得到255的兩倍。當我運行這個,我得到
255
255
這是預期和明確的行爲,它是安全的依靠?是否有鏈接解釋了不同int寬度的位操作的所有行爲?
您不使用'int',而是使用'uint32_t'。這是一個無符號整數類型,但不一定是'unsigned int',明確地不是'(signed)int'。您還通過將錯誤的變量參數類型傳遞給'printf'來調用未定義的行爲。爲'uint32_t'使用正確的格式說明符(請參閱'inttypes.h')! – Olaf
關於bithop:這應該通過一個非常簡單的搜索或在每本C書中找到。 – Olaf
@Olaf謝謝你指出。我用'printf'不太好。我在我的代碼中編輯了它,並得到了相同的結果,所以我將編輯我的文章,以便它不會分心我的真正問題。 – DJMcMayhem