C小端点但产生大端点结果?
我刚刚用下面的代码对树莓皮做了一个小实验:C小端点但产生大端点结果?,c,endianness,C,Endianness,我刚刚用下面的代码对树莓皮做了一个小实验: //tutorialspoint.com/unix_sockets/network_byte_orders.htm #include <stdio.h> int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; }un; un.s = 0x0102; if (sizeof(short) == 2
//tutorialspoint.com/unix_sockets/network_byte_orders.htm
#include <stdio.h>
int main(int argc, char **argv) {
union {
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
}
else {
printf("sizeof(short) = %d\n", sizeof(short));
}
exit(0);
}
输出:
c[0]=00aa
c[1]=0000
c[2]=0000
c[3]=0000
-1442840576
为了让它变成小endian,我不得不做一个改变
//c[0] = (num >> 24) & 0xFF;
//c[1] = (num >> 16) & 0xFF;
//c[2] = (num >> 8) & 0xFF;
//c[3] = num & 0xFF;
现在我不知道我的树莓圆周率是在小端还是大端
另外,我要通过一个套接字传递这些数据,所以我需要确保它是按网络字节顺序的,还是只要我标准化了我要在所有设备上使用的endian就可以了
另外,如果我需要手动将整数数组中的所有整数从小端数转换为大端数,我应该怎么做?我在网上找到的大多数解决方案都只是转换整数,而不是整数数组
int num = 170; // suppose to give 0000 0000 0000 00AA
不。它应该给你AA,00,00,00
(或者AA,00,00,00,00,00,00
,如果int
是64位的)。在小尾端布局中,最低有效字节存储在最低地址。
0x000000AA
(170)的最低有效字节是0xAA
不。它应该给你
AA,00,00,00
(或者AA,00,00,00,00,00,00
,如果int
是64位的)。在小尾端布局中,最低有效字节存储在最低地址。
0x000000AA
(170)的最低有效字节是0xAA
,在这两种情况下都是小尾数
在第一种情况下,最低有效字节是2,它与c[0]-小尾端匹配
在第二种情况下,最低有效字节是170(所有其他字节都是零),它与c[0]-小端字节匹配
如果要通过套接字复制数据,则只需确保数据格式一致。不管是什么
要复制一个数据数组,只需执行与单个项目相同的操作,但要重复该操作。在这两种情况下都是小端点 在第一种情况下,最低有效字节是2,它与c[0]-小尾端匹配 在第二种情况下,最低有效字节是170(所有其他字节都是零),它与c[0]-小端字节匹配 如果要通过套接字复制数据,则只需确保数据格式一致。不管是什么
要复制一个数据数组,只需做与单个项相同的事情,但重复它。代码
0000 0000 00AA
是为从左到右读取的人编写的,它将AA
存储在低位字节中,在little endian中,它给出的正是您得到的。为什么不在两个测试中使用相同的值0x0102?您将看到相同的结果:02是第一个。使用适当的位移位/掩蔽序列化。不要依赖于实现定义或潜在未定义的行为。有了一个好的编译器,就不会或只会有一个边际速度惩罚。代码0000 000aa
是为人类编写的,从左到右阅读的方式将AA
存储在低位字节中,而低位字节在little endian中给出的正是您得到的。为什么不在两个测试中使用相同的值0x0102?您将看到相同的结果:02是第一个。使用适当的位移位/掩蔽序列化。不要依赖于实现定义或潜在未定义的行为。有了一个好的编译器,就不会有或只是一个边缘速度惩罚。好吧,我明白了!谢谢:)啊,好的,我明白了!谢谢:)
int num = 170; // suppose to give 0000 0000 0000 00AA