Endianness (big-endian vs little-endian) in Embedded C - Performance Comparison
When working with endianness, we want to know how the time to convert or check byte order changes as data size grows.
We ask: How does the work grow when handling bigger numbers or more bytes?
Analyze the time complexity of the following code snippet.
unsigned int swap_endian(unsigned int val) {
return ((val >> 24) & 0x000000FF) |
((val >> 8) & 0x000000FF) |
((val << 8) & 0x0000FF00) |
((val << 24) & 0xFF000000);
}
This code swaps the byte order of a 4-byte integer to convert between big-endian and little-endian.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Bit shifting and masking on each byte of the 4-byte integer.
- How many times: Fixed 4 times, once per byte.
Each byte requires a fixed set of operations, so as the number of bytes grows, the work grows proportionally.
| Input Size (bytes) | Approx. Operations |
|---|---|
| 4 | 4 sets of shifts and masks |
| 8 | 8 sets of shifts and masks |
| 16 | 16 sets of shifts and masks |
Pattern observation: The work grows linearly with the number of bytes processed.
Time Complexity: O(n)
This means the time to swap bytes grows in direct proportion to the number of bytes in the data.
[X] Wrong: "Swapping endianness is always a constant time operation regardless of data size."
[OK] Correct: For larger data types or arrays, each byte must be processed, so time grows with data size.
Understanding how byte order conversion scales helps you write efficient embedded code and shows you can think about performance in low-level tasks.
"What if we needed to swap endianness for an array of integers instead of a single integer? How would the time complexity change?"
Practice
little-endian mean in terms of byte order?Solution
Step 1: Understand byte order concept
Little-endian means the smallest byte (least significant) is stored at the lowest memory address.Step 2: Compare with big-endian
Big-endian stores the largest byte first, so little-endian is the opposite.Final Answer:
The smallest byte is stored first in memory -> Option DQuick Check:
Little-endian = smallest byte first [OK]
- Confusing little-endian with big-endian
- Thinking bytes are stored randomly
- Mixing up byte significance order
Solution
Step 1: Understand the test logic
Setting int x=1 stores 0x00000001 in memory. In little-endian, lowest byte is 1.Step 2: Check pointer dereference
Pointer to char reads first byte. If *c == 1, system is little-endian.Final Answer:
int x = 1; char *c = (char*)&x; if (*c == 1) printf("Little-endian\n"); -> Option AQuick Check:
Check first byte == 1 means little-endian [OK]
- Using wrong value for x
- Checking *c == 0 instead of 1
- Confusing pointer types
0x12345678 stored in memory on a little-endian system, what is the byte order in memory (from lowest to highest address)?Solution
Step 1: Understand little-endian byte order
Little-endian stores the least significant byte first. For 0x12345678, bytes are 12, 34, 56, 78.Step 2: Arrange bytes in memory order
Memory order is 78 (lowest address), 56, 34, 12 (highest address).Final Answer:
78 56 34 12 -> Option BQuick Check:
Little-endian reverses byte order [OK]
- Reading bytes in normal hex order
- Mixing big-endian and little-endian
- Confusing byte significance
void print_big_endian_bytes(int x) {
unsigned char *p = (unsigned char*)&x;
for (int i = 0; i < 4; i++) {
printf("%02x ", p[i]);
}
printf("\n");
}Solution
Step 1: Analyze byte printing logic
The code prints bytes from lowest to highest address, which is system native order.Step 2: Identify missing conversion
To print big-endian, bytes must be printed from highest to lowest address on little-endian systems.Final Answer:
It prints bytes in system's native order, not big-endian -> Option AQuick Check:
Printing p[i] from 0 to 3 prints native order [OK]
- Assuming pointer type causes bug
- Ignoring byte order differences
- Thinking printf format is wrong
0x01 and 0x02. Your little-endian system reads these bytes into memory in order. How do you correctly reconstruct the original number in C?Solution
Step 1: Understand byte order from big-endian device
Big-endian sends most significant byte first: 0x01 then 0x02.Step 2: Combine bytes correctly on little-endian system
Shift first byte left 8 bits and OR with second byte: (0x01 << 8) | 0x02 = 0x0102.Final Answer:
int num = (bytes[0] << 8) | bytes[1]; -> Option CQuick Check:
Shift MSB left 8 bits, OR with LSB [OK]
- Swapping byte order incorrectly
- Adding bytes instead of bitwise OR
- Ignoring device byte order
Ready to prove it?
Pass the test and this pattern moves unknown
