Web上でgccbyteswapやその他の代替手段を使用してこの質問に対する回答があることは知っていますが、以下のコードが機能しない理由を疑問に思っていました。
まず、gcc警告(来るべきではないと感じます)があり、byteswapを使用したくない理由は、マシンがビッグエンディアンかリトルエンディアンかを判断し、それに応じてbyteswapを使用する必要があるためです。私のマシンはビッグエンディアンです。変換せずにバイトをそのまま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はまったく同じ値になるはずですが、残念ながら、まったく予期しない結果が得られます。誰かが何が悪いのかを指摘できれば素晴らしいと思います。