如何在 C 中反转整数?
How to inverse an integer in 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
。
我的代码有什么问题?
htons()
反转 x86 机器上的字节顺序。所以你的结果是正确的,只是交换了字节。看看字节顺序。
从技术上讲,没有。但是你为什么要使用 htons
?它将 16 位数据的字节顺序更改为大端(即网络字节顺序)。首先是你的变量不是 16 位而是 32 位,所以 uint16_t acc = 0xBBD1
会更合适。其次,由于您在小端机器上,字节被交换,因此输出。
我正在尝试反转十六进制值。然而,结果是错误的。
#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
。
我的代码有什么问题?
htons()
反转 x86 机器上的字节顺序。所以你的结果是正确的,只是交换了字节。看看字节顺序。
从技术上讲,没有。但是你为什么要使用 htons
?它将 16 位数据的字节顺序更改为大端(即网络字节顺序)。首先是你的变量不是 16 位而是 32 位,所以 uint16_t acc = 0xBBD1
会更合适。其次,由于您在小端机器上,字节被交换,因此输出。