Pergunta

Esta é uma acompanhamento pergunta . 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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top