The Direct Conversion: 8-Bit Signed Binary to Decimal

The 8-bit signed binary number 11010110 converts directly to -42 in decimal. When debugging microcontroller registers or parsing sensor data on an Arduino or ESP32, interpreting raw binary requires knowing both the bit-width and the encoding scheme. Modern embedded systems universally default to Two's Complement representation for signed integers. If you are reading an 8-bit I2C status or temperature register and pull the hex value 0xD6 (binary 11010110), casting it to a signed 8-bit integer (int8_t) in C/C++ will yield exactly -42.

The mathematical formula for converting an $n$-bit Two's Complement binary number to decimal weights the Most Significant Bit (MSB) as negative:

Formula: $Value = -b_{n-1}2^{n-1} + \sum_{i=0}^{n-2} b_i 2^i$

Substituting our 8-bit values (11010110):

  • $Value = (-1 \times 2^7) + (1 \times 2^6) + (0 \times 2^5) + (1 \times 2^4) + (0 \times 2^3) + (1 \times 2^2) + (1 \times 2^1) + (0 \times 2^0)$
  • $Value = -128 + 64 + 0 + 16 + 0 + 4 + 2 + 0$
  • $Value = -128 + 86 = -42$
Bench Tip: To quickly invert a Two's Complement number in your head to find its positive magnitude, flip all the bits (0 becomes 1, 1 becomes 0) and add 1. Flipping 11010110 gives 00101001 (41). Add 1, and you get 42. Apply the negative sign, and you have -42.

The Assumption That Fixes the Answer: Bit-Width

The answer of -42 hinges entirely on the assumption of an 8-bit architecture. Just as electrical power calculations shift drastically between 120V single-phase and 230V three-phase systems, binary conversions shift fundamentally based on register width (8-bit vs 16-bit vs 32-bit).

If your microcontroller reads 11010110 into a 16-bit signed integer (int16_t), the compiler pads the upper byte with zeros: 0000000011010110. Because the new MSB (bit 15) is 0, the number is now positive, evaluating to +214. To correctly represent -42 in a 16-bit register, the binary must be sign-extended, copying the MSB into the upper byte: 1111111111010110 (0xFFD6 in hex). Similarly, in a 32-bit system (int32_t), -42 is represented as 0xFFFFFFD6. Always match your C/C++ data type to the physical bit-width of the hardware register you are polling.

Neighboring Values Reference Table (±20% Range)

When tuning sensor thresholds or debugging ADC offsets, you rarely need just one number. Below is a reference table covering a ±20% magnitude range around our target (-34 to -50), showing the exact 8-bit Two's Complement binary and hex equivalents.

Decimal8-Bit Signed BinaryHex (0x)Notes
-341101 11100xDEUpper threshold boundary
-381101 10100xDA
-421101 01100xD6Target Query Value
-461101 00100xD2
-501100 11100xCELower threshold boundary

Decision Path: Choosing the Right Data Type in Embedded Code

Misinterpreting signed vs. unsigned binary is the leading cause of 'ghost' errors in embedded C, where a sensor reports 65,494 instead of -42. Use this decision tree to select the correct variable type for your firmware.

Hardware / Sensor ConditionBinary CharacteristicRequired C/C++ Data Type
Standard 10-bit ADC (e.g., ATmega328P analogRead)0 to 1023 (Inherently positive magnitude)uint16_t (or int)
8-bit I2C Status / Config RegistersBitmask flags, no negative physical meaninguint8_t
Temperature Sensor (e.g., DS18B20)Can drop below 0°C, requires negative representationint16_t (Raw 16-bit Two's Complement)
3-Axis I2C Accelerometer (e.g., MPU6050)16-bit signed, gravity vectors swing positive/negativeConcrete Pick: int16_t

When the Conversion is Meaningless

Just as calculating real AC power is meaningless without knowing the power factor, converting raw binary to a signed decimal is meaningless under three specific conditions:

  1. Unknown Endianness: If you read two 8-bit bytes from a 16-bit sensor over SPI, you must know if the hardware transmits Big-Endian (MSB first) or Little-Endian (LSB first). Swapping the bytes of a signed 16-bit number completely destroys the Two's Complement math, yielding garbage data.
  2. Raw Unipolar ADC Counts: A standard microcontroller ADC reads voltage from 0V to VREF. It cannot natively read negative voltage. The binary output is an unsigned magnitude. Applying a signed conversion directly to an ADC count without first applying a mathematical offset (e.g., ADC_val - 512) in software is logically invalid.
  3. Legacy Sign-Magnitude Formats: While Two's Complement is the universal standard for modern ALUs and microcontrollers, some legacy protocols or specific DSP chips use Sign-Magnitude (where the MSB is just a negative flag, and 10000000 means -0). Forcing Two's Complement math on Sign-Magnitude data will result in severe calculation errors.

FAQ: Signed Binary Edge Cases

Why does 8-bit signed binary stop at -128 instead of -127?
In Two's Complement, 10000000 evaluates to -128. There is no '-0' in Two's complement (unlike Sign-Magnitude). Because zero (00000000) occupies one of the positive slots, the negative side gets one extra value, ranging from -1 to -128, while the positive side ranges from 0 to +127.

How do I safely combine two 8-bit I2C registers into a 16-bit signed integer in Arduino?
Read the MSB and LSB into uint8_t variables to prevent premature sign-extension, combine them using bitwise shift operators, and cast the result.
int16_t val = (int16_t)((msb << 8) | lsb);
This guarantees the compiler treats the final 16-bit block as Two's Complement. For more on bitwise operations, refer to the Arduino Bitwise Operators Documentation.

Where can I verify standard digital logic encoding schemes?
The National Institute of Standards and Technology (NIST) maintains the definitive Dictionary of Algorithms and Data Structures, which formally defines Two's Complement boundaries and overflow behaviors for computer science and embedded engineering.