2015-08-23 51 views
-6

我想反轉一個十六進制值。但結果是錯誤的。如何在C中反轉整數?

#include <stdio.h> 
#include <stdint.h> 
#include <netinet/in.h> 

int main(void) 
{ 
    uint32_t acc = 0xBBD1; 

    printf("0x%X", htons(~acc)); // prints 0x2E44 
} 

讓我們做手工的反轉:

0xBBD1 = 1011 1011 1101 0001 
~1011 1011 1101 0001 = 
0100 0100 0010 1110 
0100 0100 0010 1110 = 0x442E 

這意味着,代碼應該實際打印0x442E,而不是0x2E44

我的代碼有什麼問題?

+3

看看bit endianness。 –

+0

@cad這是您所做的重大修改。國際海事組織,它失去了一些OP的原始問題。 – chux

+0

@chux爲什麼會有損失? – Downvoter

回答

2

從技術上講,沒有。但是你爲什麼使用htons?它將16位數據的字節序改變爲big-endian(即網絡字節順序)。首先是你的變量不是16位而是32位,所以uint16_t acc = 0xBBD1會更合適。其次,當你在一個小端機器上時,字節被交換,因此輸出。

+0

謝謝,直到現在我還不知道endian,我修正了我的代碼,將endian考慮在內。 – Adriansyah

0

htons()反轉x86機器上的字節順序。所以你的結果是正確的,只是字節交換。看看字節順序。