---
title: ByteWise - Integer Promotion
tags: bytewise, fml, integer
---
# Integer Promotion
Guess what the result is.
```c
#include <stdint.h>
#include <stdio.h>
int main() {
int8_t c1 = 1;
printf("size of c1 is %ld\n", sizeof(c1));
printf("size of -c1 is %ld\n", sizeof(-c1));
}
```
:::spoiler :boom: The answer is
```shell
size of c1 is 1
size of -c1 is 4
```
:::
---
This cluase defines what is a **integer promotion**.
> #### § 6.3.1.1 2.)
> If an **int** can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an **unsigned int**. These are called the **integer promotions**. All other types are unchanged by the integer promotions.
This footnote states when an **integer promotion** is applied.
> #### § 6.3.1.1 2.) [58]
> The integer promotions are applied only: as part of the usual arithmetic conversions, to certain argument expressions, to the operands of the unary +, -, and ~ operators, and to both operands of the shift operators, as specified by their respective subclauses.
:::info
:takeout_box: **Takeaway**:
1. Integral types smaller than `int` are promoted when an operation is performed on them.
2. If all values of the original type can be represented as an `int`, the value of the smaller type is converted to an `int`; otherwise, it is converted to an `unsigned int`.
3. Integer promotions are applied as part of the usual arithmetic conversions to certain argument expressions; operands of the unary +, -, and ~ operators; and operands of the shift operators. The following code fragment shows the application of integer promotions:
:::
Knowing this, let us re-examine our code. When applying an unary opeartor, `-`, to a `char` data, the **integer promotion** occurs. Therefore, `char` is converted to `int` an `int`.
[^1]: https://wiki.sei.cmu.edu/confluence/display/c/INT02-C.+Understand+integer+conversion+rules