Palavra-chave sem sinal em C ++

87

A palavra-chave sem sinal padrão para um tipo de dados específico em C ++? Estou tentando escrever uma função para uma classe para o protótipo:

unsigned Rotate(unsigned object, int count)

Mas eu realmente não entendo o que unsignedsignifica. Não deveria ser assim unsigned intou algo assim?

Cristal
fonte

Respostas:

92

No link acima:

Vários desses tipos podem ser modificados usando as palavras-chave assinado, não assinado, curto e longo. Quando um desses modificadores de tipo é usado sozinho, um tipo de dados de int é assumido

Isso significa que você pode assumir que o autor está usando ints.

Futureelite7
fonte
É C99 e MISRA permitido fazer isso?
agora em
42

Tipos inteiros:

short            -> signed short
signed short
unsigned short
int              -> signed int
signed int
unsigned int
signed           -> signed int
unsigned         -> unsigned int
long             -> signed long
signed long
unsigned long

Cuidado com o char:

char  (is signed or unsigned depending on the implmentation)
signed char
unsigned char
Martin York
fonte
1
@Firas: Eu sei que está em C. O int implícito não faz parte do ISO C99 nem do ISO C ++
Prasoon Saurav
4
Usar 'unsigned' (por si só) para declarar o tipo 'unsigned int' é padrão em C ++. No padrão atual: 7.1.5.2 [dcl.simple.type] tem uma tabela que identifica cada declaração de tipo para o tipo real usado. Essa tabela tem uma correspondência de declaração 'unsigned' para 'unsigned int' tipo.
David Rodríguez - dribeas
2
Observe que char tem comportamento idêntico a sinal char ou unsigned char, mas permanece um tipo separado, não importa o quê.
@Firas: Veja a Seção: 3.9.1 Tipos fundamentais. Paragrah 2: <quote> Existem cinco tipos de inteiros com sinal padrão: “sinalizado”, “curto int”, “int”, “int longo” e “int longo longo”. </quote>
Martin York
21

A palavra-chave sem sinal padrão para um tipo de dados em C ++

Sim, assinado e não assinado também podem ser usados ​​como especificadores de tipo autônomo

Os tipos de dados inteiros char, short, long e int podem ser assinados ou não, dependendo do intervalo de números necessário para ser representado. Os tipos com sinal podem representar valores positivos e negativos, enquanto os tipos sem sinal só podem representar valores positivos (e zero).

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

No entanto, assinado e não assinado também podem ser usados ​​como especificadores de tipo autônomo, significando o mesmo que int assinado e não assinado, respectivamente. As duas declarações a seguir são equivalentes:

unsigned NextYear;
unsigned int NextYear;
Prasoon Saurav
fonte
3
Não é um "sim", então? O padrão é int, se usado sem um tipo?
relaxe de
Obrigado! Inglês não é minha primeira língua e fiquei perplexo com o significado do tipo de dados sem sinal. De quem é a assinatura que contém? Nunca me ocorreu que poderia ser do signo nominal ...: D
user74200
As palavras short- chave e longtambém são modificadores de tipo . Se você escrever short s, isso realmente significa short int s, assim como unsigned urealmente significa unsigned int u. (e unsigned shortsignifica unsigned short int)
Ben Voigt
8

Você pode ler sobre a palavra-chave unsigned na Referência C ++ .

Existem dois tipos diferentes neste assunto, assinados e não assinados. O padrão para inteiros é assinado, o que significa que eles podem ter valores negativos.

Em um sistema de 32 bits, um número inteiro é de 32 bits, o que significa que pode conter um valor de ~ 4 bilhões.

E quando for assinado, isso significa que você precisa dividi-lo, deixando -2 bilhões a +2 bilhões.

Quando não tem sinal, entretanto, o valor não pode conter nenhum número negativo, portanto, para inteiros, isso significaria de 0 a +4 bilhões.

Há um pouco mais de informações sobre isso na Wikipedia .

Filip Ekberg
fonte
2
Eu gosto de cantar para a maioria das coisas. Carbono delicioso e carmelização!
Omnifário de
1
Que tal editar erros de digitação? ... é para isso que o botão "editar" existe!
Filip Ekberg de
3

Sim, isso significa unsigned int. Costumava ser que, se você não especificasse um tipo de dados em C, haveria muitos lugares onde apenas assumia int. Esta foi a tentativa, por exemplo, de tipos de retorno de função.

Esta verruga foi quase totalmente erradicada, mas você está encontrando seus últimos vestígios aqui. IMHO, o código deve ser corrigido unsigned intpara evitar o tipo de confusão que você está enfrentando.

Omniforme
fonte