While I do understand endianness, I am slightly unclear on how the code works below. I guess this question is less about endianness and more about how the char * pointer and int work i.e. type conversion. Also, would it have made any difference if the variable word
was not a short
but just an int
? Thanks!
#define BIG_ENDIAN 0
#define LITTLE_ENDIAN 1
int byteOrder() {
short int word = 0x0001;
char * byte = (char *) &word;
return (byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN);
}
If it is little-endian, it would be stored as “01 00 00 00”. The program checks the first byte by dereferencing the cptr pointer. If it equals to 0, it means the processor is big-endian(“00 00 00 01”), If it equals to 1, it means the processor is little-endian (“01 00 00 00”).
Endianness is a term that describes the order in which a sequence of bytes is stored in computer memory. Endianness can be either big or small, with the adjectives referring to which value is stored first.
We can also check the endianness of the machine using the union. We need to create a union that has an integer variable and an array of 4 characters. If the first element (au8DataBuff [0]) of the character array is equal to the LSB Bytes of integer, then the system will be little endian otherwise big-endian.
The advantages of Little Endian are: It's easy to read the value in a variety of type sizes. For example, the variable A = 0x13 in 64-bit value in memory at the address B will be 1300 0000 0000 0000 . A will always be read as 19 regardless of using 8, 16, 32, 64-bit reads.
A short int is made up of two bytes, in this case 0x00
and 0x01
. On a little endian system, the small byte comes first, so in memory it appears as 0x01
followed by 0x00
. Big endian systems are, naturally, reversed. This is what the pointers look like for short integers on a little endian system:
----------------------- -----------------------
| 0x01 | 0x00 | | | |
----------------------- -----------------------
&word &word+1
Char pointers, on the other hand, are always incremented sequentially. Thus, by taking the address of the first byte of the integer and casting it to a char *
pointer, you may increment through each byte of the integer in memory-order. Here's the corresponding diagram:
------------ ------------ ------------ ------------
| 0x01 | | 0x00 | | | | |
------------ ------------ ------------ ------------
&byte &byte+1 &byte+2 &byte+3
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With