我知道使用 gcc byteswap 和网络上的其他替代方法可以解决这个问题,但我想知道为什么下面的代码不起作用。
首先,我有 gcc 警告(我觉得不应该出现),我不想使用字节交换的原因是因为我需要确定我的机器是大端还是小端并相应地使用字节交换,例如,如果我的机器是大端的,我可以按原样 memcpy 字节而不需要任何翻译,否则我需要交换它们并复制它。
static inline uint64_t ntohl_64(uint64_t val)
{
unsigned char *pp =(unsigned char *)&val;
uint64_t val2 = ( pp[0] << 56 | pp[1] << 48
| pp[2] << 40 | pp[3] << 32
| pp[4] << 24 | pp[5] << 16
| pp[6] << 8 | pp[7]);
return val2;
}
int main()
{
int64_t a=0xFFFF0000;
int64_t b=__const__byteswap64(a);
int64_t c=ntohl_64(a);
printf("\n %lld[%x] [%lld] [%lld]\n ", a, a, b, c);
}
Warnings:-
In function \u2018uint64_t ntohl_64(uint64_t)\u2019:
warning: left shift count >= width of type
warning: left shift count >= width of type
warning: left shift count >= width of type
warning: left shift count >= width of type
Output:-
4294901760[00000000ffff0000] 281470681743360[0000ffff00000000] 65535[000000000000ffff]
我在一个小端机器上运行它,所以 byteswap 和 ntohl_64 应该产生完全相同的值,但不幸的是我得到了完全出乎意料的结果。如果有人能指出什么是错的,那就太好了。