Signed vs unsigned behavior on 8-bit MCU in Embedded C - Performance Comparison
We want to see how the program's running time changes when using signed or unsigned numbers on an 8-bit MCU.
How does the choice between signed and unsigned affect the number of steps the MCU takes?
Analyze the time complexity of the following code snippet.
#include <stdint.h>
void count_down_signed(int8_t start) {
while (start > 0) {
start--;
}
}
void count_down_unsigned(uint8_t start) {
while (start > 0) {
start--;
}
}
This code counts down from a starting number to zero using signed and unsigned 8-bit integers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that decreases the variable until it reaches zero.
- How many times: The loop runs once for each number from the start value down to 1.
As the start value increases, the number of loop steps grows roughly the same way for both signed and unsigned.
| Input Size (start) | Approx. Loop Iterations |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 127 (max signed) | 127 |
Pattern observation: The loop count grows directly with the start value until the signed max is reached.
Time Complexity: O(n)
This means the running time grows linearly with the starting number, whether signed or unsigned.
[X] Wrong: "Unsigned variables always run faster than signed ones because they are simpler."
[OK] Correct: On an 8-bit MCU, both signed and unsigned decrement loops take similar steps; speed depends more on instructions than sign.
Understanding how signed and unsigned variables behave helps you write efficient code on small MCUs and shows you think about how hardware affects software.
"What if we changed the loop to count up from zero to the start value? How would the time complexity change?"
Practice
char on a typical MCU?Solution
Step 1: Understand 8-bit signed char range
An 8-bit signed char uses one bit for sign and 7 bits for value, so it can represent values from -128 to 127.Step 2: Compare with options
Only -128 to 127 matches the correct range for signed 8-bit char.Final Answer:
-128 to 127 -> Option AQuick Check:
Signed 8-bit char range = -128 to 127 [OK]
- Confusing signed and unsigned ranges
- Assuming 8-bit signed char goes to 255
- Mixing up sign bit usage
Solution
Step 1: Identify unsigned 8-bit type syntax
In embedded C,unsigned charis the standard way to declare an unsigned 8-bit variable.Step 2: Check other options
signed char var; is signed, char unsigned var; is invalid syntax, int8_t var; is signed 8-bit integer.Final Answer:
unsigned char var; -> Option DQuick Check:
Unsigned 8-bit variable = unsigned char [OK]
- Using 'char unsigned' which is invalid syntax
- Assuming 'int8_t' is unsigned
- Confusing signed and unsigned keywords
unsigned char a = 250;
signed char b = (signed char)a;
printf("%d", b);What is the output?
Solution
Step 1: Understand casting from unsigned to signed
Variableaholds 250 (unsigned). Casting to signed char wraps around because signed char max is 127.Step 2: Calculate signed char value
250 - 256 = -6 (wrap-around in 8-bit signed range)Final Answer:
-6 -> Option BQuick Check:
Unsigned 250 cast to signed 8-bit = -6 [OK]
- Assuming cast keeps original unsigned value
- Confusing sign extension with wrap-around
- Ignoring 8-bit overflow behavior
unsigned char x = 200;
signed char y = -100;
unsigned char z = x + y;
printf("%u", z);What is the output?
Solution
Step 1: Understand integer promotion in addition
In expressions,unsigned charandsigned charare promoted to int before addition.Step 2: Calculate the sum
200 + (-100) = 100 as int, but when assigned to unsigned char (8-bit), it wraps modulo 256. Since 100 fits in 8 bits, the value is 100.Step 3: Print the result
printf with %u prints unsigned int, so output is 100.Final Answer:
100 -> Option CQuick Check:
Signed promoted to int before addition, result 100 [OK]
- Adding raw unsigned and signed bytes without promotion
- Assuming overflow without checking promotion
- Misinterpreting printf format specifiers
unsigned char a = 100;
unsigned char b = 150;
unsigned char c = a - b;
printf("%u", c);What will be printed and why?
Solution
Step 1: Understand unsigned subtraction wrap-around
Unsigned 8-bit subtraction wraps modulo 256. 100 - 150 = -50, which wraps to 256 - 50 = 206.Step 2: Confirm printf output
Variablecholds 206, so printf with %u prints 206.Final Answer:
206 because unsigned subtraction wraps around modulo 256 -> Option AQuick Check:
Unsigned subtraction wraps modulo 256 = 206 [OK]
- Expecting negative numbers in unsigned arithmetic
- Assuming error on negative result
- Thinking subtraction gives absolute difference
Ready to prove it?
Pass the test and this pattern moves unknown
