Pergunta

Diante desse campo:

char lookup_ext[8192] = {0}; // Gets filled later

E esta declaração:

unsigned short *slt = (unsigned short*) lookup_ext;

O que acontece nos bastidores?

lookup_ext [1669] retornos 67 = 0100 0011 (C), lookup_ext [1670] retornos 78 = 0100 1110 (N) e lookup_ext [1671] retornos 68 = 0100 0100 (D); ainda slt [1670] retorna 18273 = 0100 0111 0110 0001.

Eu estou tentando esta porta para C #, então além de uma maneira fácil de sair deste, eu também estou querendo saber o que realmente acontece aqui. Já faz um tempo desde que eu usei C ++ regularmente.

Obrigado!

Foi útil?

Solução

A afirmação de que você mostra não lançar um char para uma curta não assinada, ele lança um ponteiro para um char a um ponteiro para uma curta não assinada. Isto significa que as conversões aritméticas usuais dos dados apontou-a-não vão acontecer e que os dados de char subjacentes só vai ser interpretada como calções não assinados quando acessado através da variável slt.

Note que sizeof(unsigned short) é improvável que seja um, para que slt[1670] não correspondem necessariamente a lookup_ext[1670]. É mais provável - se, digamos, sizeof(unsigned short) é dois -. Corresponder a lookup_ext[3340] e lookup_ext[3341]

Você sabe por que o código original está usando este aliasing? Se não for necessário, pode valer a pena tentar fazer o C ++ código mais limpo e verificar que o comportamento não é alterado antes de portá-lo.

Outras dicas

Se bem entendi, a conversão de tipo será converter uma matriz de char de tamanho 8192 para uma matriz int curto de tamanho metade desse, que é 4096.

Então, eu não entendo o que você está comparando a sua pergunta. slt [1670] deve corresponder a lookup_ext [1670 * 2] e lookup_ext [1670 * 2 + 1].

Bem, esta declaração

char lookup_ext[8192] = {0}; // Gets filled later

Cria uma matriz, quer localmente ou não-localmente, dependendo de onde ocorre a definição. Inicializando-lo assim, com um inicializador agregado irá inicializar todos os seus elementos para zero (o primeiro explicitamente, os restantes implicitamente). Por isso eu quero saber porque seu programa gera valores diferentes de zero. A menos que o preenchimento acontece antes da leitura, então isso faz sentido.

unsigned short *slt = (unsigned short*) lookup_ext;

Isso vai interpretar os bytes que compõem a matriz como objetos curtos sem sinal quando você lê a partir alvo desse ponteiro. Estritamente falando, o acima é um comportamento indefinido, porque você não pode ter certeza a matriz está alinhado adequado, e você iria ler a partir de um ponteiro que não está apontando para o tipo do tipo pontas originais (unsigned char <-> unsigned short). Em C ++, a única maneira portátil para ler o valor de algum outro pod (dados antigos simples. Isso é todas as estruturas e tipos simples que são possíveis em C também (como short), em termos gerais) é usando essas funções de biblioteca como memcpy ou memmove.

Então, se você ler *slt acima, você iria interpretar o primeiro sizeof(*slt) bytes da matriz, e tentar lê-lo como unsigned short (que é chamado type pun).

Quando você faz "unsigned short slt = (unsigned short ) lookup_ext;", o não. de bytes equivalentes para o tamanho de (unsigned short) são captadas a partir de uma dada localização por lookup_ext, e armazenado no local apontado para por slt. Desde unsigned short seria 2 bytes, os dois primeiros bytes de lookup_ext seriam armazenados no local determinado pelo slt.

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