Bird
Raised Fist0
Embedded Cprogramming~10 mins

Signed vs unsigned behavior on 8-bit MCU in Embedded C - Visual Side-by-Side Comparison

Choose your learning style10 modes available
Concept Flow - Signed vs unsigned behavior on 8-bit MCU
Start with 8-bit variable
↓
Assign value (signed or unsigned)
↓
Store in 8 bits
↓
Interpret bits as signed or unsigned
↓
Perform arithmetic or comparison
↓
Result depends on signedness
↓
Use result in program
This flow shows how an 8-bit variable stores values and how interpreting bits as signed or unsigned changes the result.
Execution Sample
Embedded C
unsigned char u = 250;
signed char s = 250;

printf("u = %u\n", u);
printf("s = %d\n", s);
This code assigns 250 to both unsigned and signed 8-bit variables and prints their values.
Execution Table
StepVariableValue AssignedStored Bits (8-bit)Interpreted ValuePrint Output
1u (unsigned char)25011111010250u = 250
2s (signed char)25011111010-6s = -6
3End---Execution ends
💡 Execution stops after printing both values.
Variable Tracker
VariableStartAfter AssignmentFinal
u (unsigned char)undefined250250
s (signed char)undefined250 (stored as 11111010)-6 (interpreted signed)
Key Moments - 3 Insights
Why does assigning 250 to a signed 8-bit variable show -6 when printed?
Because 8-bit signed variables use two's complement. The bits 11111010 represent -6 in signed form, as shown in execution_table row 2.
Why does the unsigned variable print 250 correctly?
Unsigned variables interpret bits as positive numbers only, so 11111010 is 250 decimal, as seen in execution_table row 1.
What happens if arithmetic is done on signed vs unsigned variables?
Arithmetic results depend on interpretation: signed variables can represent negative numbers, unsigned cannot, affecting overflow and comparisons.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the interpreted value of the signed char variable after assignment?
A250
B-6
C6
D-250
💡 Hint
Check execution_table row 2 under 'Interpreted Value' column.
At which step does the unsigned variable get assigned its value?
AStep 2
BStep 3
CStep 1
DNo assignment
💡 Hint
Look at execution_table row 1 under 'Variable' and 'Value Assigned'.
If the signed char variable was assigned 130 instead of 250, what would be its interpreted value?
A-126
B130
C-130
D126
💡 Hint
Signed 8-bit range is -128 to 127; 130 stored as bits wraps to negative number similar to 250 case.
Concept Snapshot
Signed vs unsigned 8-bit variables store the same bits but interpret them differently.
Unsigned chars hold 0 to 255.
Signed chars hold -128 to 127 using two's complement.
Assigning values >127 to signed chars wraps to negative numbers.
Printing must match variable type to show correct value.
Full Transcript
This lesson shows how 8-bit microcontrollers store values in variables. When you assign a number like 250 to an unsigned 8-bit variable, it stores the bits 11111010 and prints 250. But if you assign 250 to a signed 8-bit variable, it stores the same bits but interprets them as -6 because signed 8-bit uses two's complement. This difference affects how arithmetic and comparisons work. Always remember to use the correct type and print format to see the expected values.

Practice

(1/5)
1. What is the range of values for an 8-bit signed char on a typical MCU?
easy
A. -128 to 127
B. 0 to 255
C. -256 to 255
D. -127 to 128

Solution

  1. 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.
  2. Step 2: Compare with options

    Only -128 to 127 matches the correct range for signed 8-bit char.
  3. Final Answer:

    -128 to 127 -> Option A
  4. Quick Check:

    Signed 8-bit char range = -128 to 127 [OK]
Hint: Signed 8-bit char always includes negative half [OK]
Common Mistakes:
  • Confusing signed and unsigned ranges
  • Assuming 8-bit signed char goes to 255
  • Mixing up sign bit usage
2. Which of the following declarations correctly defines an unsigned 8-bit variable in embedded C?
easy
A. signed char var;
B. int8_t var;
C. char unsigned var;
D. unsigned char var;

Solution

  1. Step 1: Identify unsigned 8-bit type syntax

    In embedded C, unsigned char is the standard way to declare an unsigned 8-bit variable.
  2. Step 2: Check other options

    signed char var; is signed, char unsigned var; is invalid syntax, int8_t var; is signed 8-bit integer.
  3. Final Answer:

    unsigned char var; -> Option D
  4. Quick Check:

    Unsigned 8-bit variable = unsigned char [OK]
Hint: Use 'unsigned char' for unsigned 8-bit variables [OK]
Common Mistakes:
  • Using 'char unsigned' which is invalid syntax
  • Assuming 'int8_t' is unsigned
  • Confusing signed and unsigned keywords
3. Consider this code snippet on an 8-bit MCU:
unsigned char a = 250;
signed char b = (signed char)a;
printf("%d", b);

What is the output?
medium
A. 250
B. -6
C. 6
D. -250

Solution

  1. Step 1: Understand casting from unsigned to signed

    Variable a holds 250 (unsigned). Casting to signed char wraps around because signed char max is 127.
  2. Step 2: Calculate signed char value

    250 - 256 = -6 (wrap-around in 8-bit signed range)
  3. Final Answer:

    -6 -> Option B
  4. Quick Check:

    Unsigned 250 cast to signed 8-bit = -6 [OK]
Hint: Subtract 256 if unsigned > 127 when casting to signed [OK]
Common Mistakes:
  • Assuming cast keeps original unsigned value
  • Confusing sign extension with wrap-around
  • Ignoring 8-bit overflow behavior
4. This code runs on an 8-bit MCU:
unsigned char x = 200;
signed char y = -100;
unsigned char z = x + y;
printf("%u", z);

What is the output?
medium
A. 156
B. 44
C. 100
D. 300

Solution

  1. Step 1: Understand integer promotion in addition

    In expressions, unsigned char and signed char are promoted to int before addition.
  2. 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.
  3. Step 3: Print the result

    printf with %u prints unsigned int, so output is 100.
  4. Final Answer:

    100 -> Option C
  5. Quick Check:

    Signed promoted to int before addition, result 100 [OK]
Hint: Signed promoted to int before addition, watch final cast [OK]
Common Mistakes:
  • Adding raw unsigned and signed bytes without promotion
  • Assuming overflow without checking promotion
  • Misinterpreting printf format specifiers
5. On an 8-bit MCU, you want to store the result of subtracting 150 from 100 using unsigned 8-bit variables:
unsigned char a = 100;
unsigned char b = 150;
unsigned char c = a - b;
printf("%u", c);

What will be printed and why?
hard
A. 206 because unsigned subtraction wraps around modulo 256
B. -50 because subtraction keeps sign in unsigned
C. 50 because it calculates absolute difference
D. Error due to negative result in unsigned

Solution

  1. Step 1: Understand unsigned subtraction wrap-around

    Unsigned 8-bit subtraction wraps modulo 256. 100 - 150 = -50, which wraps to 256 - 50 = 206.
  2. Step 2: Confirm printf output

    Variable c holds 206, so printf with %u prints 206.
  3. Final Answer:

    206 because unsigned subtraction wraps around modulo 256 -> Option A
  4. Quick Check:

    Unsigned subtraction wraps modulo 256 = 206 [OK]
Hint: Unsigned subtraction wraps modulo 256 on 8-bit MCU [OK]
Common Mistakes:
  • Expecting negative numbers in unsigned arithmetic
  • Assuming error on negative result
  • Thinking subtraction gives absolute difference
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard