问题
typedef union status
{
int nri;
char cit[2];
}Status;
int main() {
Status s;
s.nri = 1;
printf("%d \n",s.nri);
printf("%d,%d,\n",s.cit[0],s.cit[1]);
}
OUTPUT:
1
0,1
I know this output on the second line is depend on the endianess of the CPU. How I can write such in a platform-independant program? Is there any way of checking the endianess of the CPU?
回答1:
You can use htonl() and/or ntohl(). htonl()
stands for "host to network long", while ntohl()
stands for "network to host long". The "host" and "network" refers to the byte order. Network byte order is "big-endian". The operations will be no-ops if the host platform is also "big-endian". Using these routines, the following program will always report the same output:
uint32_t x = htonl(1);
unsigned char *p = (void *)&x;
printf("%u %u %u %u\n", p[0], p[1], p[2], p[3]);
uint32_t y = ntohl(x);
assert(y == 1);
回答2:
If you want endian-independent code, then you want platform-indepentent code as well, otherwise your requirements don't make sense. Code which does not rely on endianess cannot rely of the size of an int, nor on the signedness of char.
To get something truly portable, I suppose you would have to write something similar to this:
#include <stdio.h>
#include <stdint.h>
#define INT_BITS (sizeof(int) * 8)
#define BYTE0_MASK (0xFFu << (INT_BITS - 8))
#define BYTE1_MASK (0xFFu << (INT_BITS - 16))
int main()
{
int i = 0xAABBCCDD;
unsigned char arr [2] =
{
(i & BYTE0_MASK) >> (INT_BITS - 8),
(i & BYTE1_MASK) >> (INT_BITS - 16)
};
printf("%x %x", arr[0], arr[1]);
}
回答3:
Endianness is usually not an issue if your program does not communicate with other program (including the same program written for another platform), unless you do something very special like the union defined in your question. When your program does communicate with other programs, like saving binary data into a file, sending data in a socket, it'd be better to define the endianness clearly in the format/protocol. Alternatively you can also transmit the data in textual form.
来源:https://stackoverflow.com/questions/18863913/union-and-endianness