A linguagem C possui modificadores de sinalização que podem ser usados em conjunto com os tipos númericos já estudados. Com esse modificadores podemos alterar a faixa valores aceita de cada um desses tipos.

Esse modificador é padrão para qualquer tipo de dado numérico utilizado, não sendo necessário a declaração. Seu objetivo é fazer com que um tipo de dado que utilize o signed tenha sua representação numérica com sinalização positiva ou negativa. Essa sinalização é feita com a utilização do bit mais significativo com sinal.

Tab. 1: Sinalização em um tipo char
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
1 - - - - - - -

Quando um modificador de sinalização é utilizado, internamente, caso o valor no bit 7 seja 0, o número em questão é não-sinalizado, caso contrário, o número é sinalizado.

O modificador signed não pode ser utilizado em conjunto com os tipos primitivos double e float. Um erro de compilação será gerado caso a tentativa de uso seja feita.

Sintaxe
signed tipo_dado nome_variavel;
Onde
tipo_dado: tipo de dado numérico. Exceto float e double.
Exemplo 1
#include <stdio.h>
void main(void)
{
    signed int a = 0xFFFFFFFF;
    signed char b = 0x80;
    printf("%d %d", a,b);
}
Saída
-1 -128

A faixa de valores suportado na variável b declarada no exemplo acima é de -128 até 127. Essa faixa de valores já havia sido mencionada anteriormente ao ser discutido sobre o tipo char.

A variável a por sua vez, tem a faixa de valores entre −2.147.483.647 e +2,147,483,647.

Exemplo 2
#include <stdio.h>
void main(void)
{
    signed int a = 100;
    signed char b = 0x7F;
    printf("%d %c", a,b);
}
Saída
100 127

O modificador unsigned, em contrapartida ao modificador signed explicado anteriormente, não utiliza sinalização. Seu objetivo é fazer com que um tipo de dado que utilize o unsigned tenha sua representação numérica sempre seja positiva.

Sintaxe
unsigned tipo_dado nome_variavel;
Onde
tipo_dado: tipo de dado numérico. Exceto float e double.
Exemplo 3
#include <stdio.h>
void main(void)
{
    unsigned char a = 0xff;
    signed char b = 0xff;
    printf("%d %d",a,b);
}
Saída
255 -1

Como pode ser abservada pela saída acima, a faixa de valores suportados na variável a declarada no exemplo acima é de 0 até 255.

Abaixo, uma tabela com os tipos de dados char e int em que os modificadores signed e unsigned foram aplicados, e seus respectivos intervalos de dados resultantes.

Tab 1: signed e unsigned
Tipo signed unsigned
int −2.147.483.647 ~ +2,147,483,647 0 ~ 4.294.967.295
short −32,767 ~ +32,767 0 ~ 65,535
char -128 ~127 0 ~ 255
  1. 05/10/2024 - revisão 3 - Ajustes pontuais
  2. 30/08/2024 - revisão 2 - Correção em link modificador unsigned
  3. 27/09/2023 - revisão 1 - Correção em referências, intervalo de valores, erros gramaticais e adição de tabela de intervalo
  4. 19/05/2023 - versão inicial