qual é o tipo de dados não assinado?

93

Já vi esse unsignedtipo "sem tipo" ser usado algumas vezes, mas nunca vi uma explicação para isso. Suponho que haja um signedtipo correspondente . Aqui está um exemplo:

O que reuni até agora:
- no meu sistema, sizeof(unsigned) = 4(sugere um int não assinado de 32 bits)
- pode ser usado como uma abreviação para lançar outro tipo para a versão não assinada:

É ANSI C ou apenas uma extensão do compilador?

hhaamu
fonte

Respostas:

147

unsignedrealmente é uma abreviação de unsigned int, e assim definido no padrão C.

Martin v. Löwis
fonte
32

unsignedsignifica unsigned int. signedsignifica signed int. Usar just unsignedé uma maneira preguiçosa de declarar um unsigned intem C. Sim, é ANSI.

Polaris878
fonte
15

Historicamente em C, se você omitiu um tipo de dados "int" foi assumido. Portanto, "unsigned" é uma abreviação de "unsigned int". Isso tem sido considerado uma prática ruim por muito tempo, mas ainda há uma boa quantidade de código por aí que o usa.


fonte
6
Eu não sabia que era uma prática ruim. Existe uma razão para isso? longem vez de long inté muito comum, então não sei por que, em unsignedvez de unsigned int, não seria aceitável.
CB Bailey
10
@Charles Bailey: atualmente - pelo menos se você estiver sendo pragmático em vez de formal - long, int, short e char são considerados tipos de dados diferentes, pois podem ter tamanhos diferentes) com unsigned (e o padrão, assinado) sendo um qualificador. Assim, você tenderia a usar "unsigned int" da mesma forma que usaria "unsigned long" ou "unsigned char" (e isso deixa claro que você não perdeu o int). O int em "long int" ou "short int" é supérfluo.
Dipstick
1
@Dipstick, "long" é um qualificador para "int". Parece que o int em "unsigned int" é tão supérfluo quanto o int em "unsigned long int".
Conrad Meyer
1
Isso não é o mesmo que a regra "int" implícita. Essa resposta é enganosa.
8

em C, unsignedé um atalho para unsigned int.

Você tem o mesmo para longque seja um atalho paralong int

E também é possível declarar a unsigned long(será a unsigned long int).

Isso está no padrão ANSI

ThibThib
fonte
Sim. unsignedé o mesmo que unsigned intmas fiz uma pesquisa no WG14 / N1124 Committee Draft - 6 de maio de 2005 ISO / IEC 9899: TC2 para unsignede não consegui encontrar onde está definido ... poderia citar a parte onde está definido?
user454322
5

Em C e C ++

Um inteiro sem sinal contendo n bits pode ter um valor entre 0 e (2 ^ n-1), que é 2 ^ n valores diferentes.

Um inteiro sem sinal é positivo ou zero.

Inteiros assinados são armazenados em um computador usando o complemento de 2.

Rabin Sah
fonte
2

De acordo com C17 6.7.2 §2:

Cada lista de especificadores de tipo deve obrigatoriamente ser um dos seguintes multisets (delimitado por vírgulas, quando houver mais de um multiset por item); os especificadores de tipo podem ocorrer em qualquer ordem, possivelmente misturados com os outros especificadores de declaração

- void
- char
- assinado char
- unsigned char
- curto, assinado short, short int ou assinado short int
- unsigned short, ou unsigned short int
- int, assinado ou assinado int
- unsigned ou unsigned int
- longo, assinado longo , longo int, ou assinado longo int
- não assinado longo, ou não assinado longo int
- longo longo, assinado longo longo, longo int longo ou assinado longo longo int
- não assinado longo longo, ou não assinado longo longo int
- flutuante
- duplo
- longo duplo
- _Bool
- float _Complex
- double _Complex - especificador de estrutura ou união - especificador de enum - nome de typedef
- long double _Complex
- especificador de tipo atômico


Portanto, no caso de unsigned intpodermos escrever unsignedou unsigned int, ou se estivermos loucos int unsigned,. Este último, uma vez que o padrão é estúpido o suficiente para permitir "... pode ocorrer em qualquer ordem, possivelmente misturado". Esta é uma falha conhecida da linguagem.

Usos de código C adequados unsigned int.

Lundin
fonte
1

Trazendo minha resposta de outra pergunta .

A partir da especificação C , seção 6.7.2:

- unsigned ou unsigned int

O que significa que unsigned, quando não for especificado o tipo, deve ser padrão unsigned int. Então escrever unsigned aé o mesmo que unsigned int a.

Bruno ferreira
fonte