Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C小端点但产生大端点结果?_C_Endianness - Fatal编程技术网

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