notação hexadecimal e inteiros assinados
Pergunta
Esta é uma acompanhamento pergunta ??a >. Então, inteiros da loja de Java em two's-complementos e você pode fazer o seguinte:
int ALPHA_MASK = 0xff000000;
Em C este # requer o uso de um inteiro sem sinal, uint
, porque interpreta que isso seja 4278190080
vez de -16777216
.
A minha pergunta, como é que os valores negativos de declaração em notação hexadecimal em c #, e exatamente como são inteiros representado internamente? Quais são as diferenças para Java aqui?
Solução
C # (sim, NET) também usa o complemento de dois, mas ele suporta ambos os tipos assinados e não assinados (que Java não faz). A máscara de bits é mais naturalmente uma coisa não assinado - por que um deve bit ser diferente do que todos os outros bits
Neste caso específico, é seguro usar um elenco desmarcado:
int ALPHA_MASK = unchecked((int)0xFF000000);
Para "diretamente" representar este número como um valor assinado, você escreve
int ALPHA_MASK = -0x1000000; // == -16777216
hexadecimal não é (ou não deve) ser diferente da decimal: para representar um número negativo, você precisa escrever um sinal negativo, seguido pelos dígitos que representam o valor absoluto
.Outras dicas
Bem, você pode usar um bloco desmarcada e um elenco:
unchecked
{
int ALPHA_MASK = (int)0xff000000;
}
ou
int ALPHA_MASK = unchecked((int)0xff000000);
Não terrivelmente conveniente, embora ... talvez apenas usar um literal inteiro?
E só para adicionar insulto à injúria, isso vai funcionar também:
-0x7F000000