Pergunta

Eu sei unsigned int não pode conter valores negativos. Mas os seguintes compila o código sem erros / avisos.

unsigned int a = -10;

Quando eu imprimir a variável a , recebo um valor errado impresso. Se as variáveis ??não assinados não pode conter valores assinados, por que compiladores permitir-lhes para compilar sem dar qualquer erro / aviso?

Qualquer pensamento?

Editar

Compiler: VC ++ compilador

Solução

necessidade de usar o nível de aviso 4.

Foi útil?

Solução

Microsoft Visual C ++:

aviso C4245: 'inicializar': conversão de 'int' para 'não assinado int', assinado / sem assinatura incompatibilidade

No aviso de nível 4.

G ++

me dá o aviso:

AVISO: a conversão de valor negativo -0x00000000a' tounsigned int '

Sem qualquer -W directivas.

GCC

Você deve usar:

gcc main.c -Wconversion

O que vai dar o aviso:

aviso: negativo inteiro implicitamente convertido para o tipo unsigned

Note que -Wall não vai permitir que este aviso.


Talvez você só precisa transformar seus níveis de aviso para cima.

Outras dicas

A conversão de um signed int a um unsigned int é algo conhecido no padrão C como uma "conversão aritmética Usual", por isso não é um erro.

Os compiladores razão muitas vezes não emitir um aviso sobre isso por padrão é porque é tão comumente feito em código haveria demasiadas 'falso positivo' avisos emitidos em geral. Há uma enorme quantidade de código lá fora, que trabalha com valores signed int para lidar com as coisas que são inerentemente não assinados (tamanhos de buffer de cálculo, por exemplo). Também é muito comum para misturar valores assinados e não assinados em expressões.

Isso não quer dizer que essas conversões silenciosos não são responsáveis ??por erros. Assim, ele pode não ser uma má idéia para permitir que o alerta para novo código por isso é 'limpo' desde o início. No entanto, eu acho que você provavelmente acharia bastante esmagadora para lidar com os avisos emitidos pelo código existente.

-10 é analisado como um valor inteiro, e atribuindo int para unsigned int é permitido. Para saber que você está fazendo errado algo que o compilador tem de verificar se o seu inteiro (-10) é negativo ou positivo. Como ele é mais do que uma verificação de tipo, eu acho que ele foi desativado por problemas de desempenho.

Para compilador gcc você pode adicionar

gcc -Wconversion ...

E isso irá produzir o seguinte aviso

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'

Eu estou usando g ++ 4.9.2 e necessidade de usar -Wsign conversão para fazer este aviso aparecer.

gcc.gnu.org : Avisos sobre conversões entre números inteiros assinados e não assinados são desabilitados por padrão em C ++, a menos -Wsign conversão é explicitamente habilitado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top