Por compilador não está dando erro ao valor assinado é atribuída ao inteiro sem sinal? - C ++
-
12-09-2019 - |
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.
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' to
unsigned 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.