Ao codificar em idiomas de baixo nível como o IC, descobrir que converter às vezes significa 'reinterpretar esses bytes como se sempre tivesse sido desse outro tipo' e, outras vezes, como 'converter esse valor inteligentemente nesse outro tipo'.
Qual é o significado original da palavra e existe alguma consistência em quando esperar uma conversão e quando esperar uma reinterpretação bruta?
terminology
type-casting
Alexander Torstling
fonte
fonte
cast
no sentido da computação é mais semelhante ao vazamento no sentido da metalurgia, pelo qual a forma de um metal fundido é reformada quando derramada em um molde: britannica.com/EBchecked/topic/377665/metallurgy/81884/CastingRespostas:
A transmissão em C é única, diferente de outras línguas. Também nunca é inteligente.
A conversão em C converte valores de um tipo para outro usando regras cuidadosamente definidas. Se você realmente precisa saber, leia o padrão. Caso contrário, os pontos principais são:
Algumas conversões são aplicadas implicitamente e, em outras, o compilador emitirá um aviso. Melhor prestar atenção aos avisos!
A definição de dicionário para o elenco é melhor ignorada, pois é inútil. Muitos elencos são melhor descritos pelos termos conversão ou coerção, portanto vale a pena conhecê-los também.
C ++ é MUITO mais complicado, mas você não perguntou isso, perguntou?
fonte
T*
paravoid*
e volta é sempre bem definido.Esta parte do dicionário Webster fornece a definição adequada:
Portanto, antes da transmissão, seu "objeto" (não literalmente um objeto OOP) está em uma determinada forma (tipo). Quando você o molda novamente, isso é "despeje concreto" ao seu redor para torná-lo em uma nova forma, é o que você faz com o vazamento. Você tem um número como um número inteiro em forma de hexágono e, após a conversão, obterá uma sequência em forma de retângulo.
fonte
Pode ser útil separar as conversões C em dois grupos:
Conversões numéricas - converte um número entre uma representação em outra, tentando manter o valor. Por exemplo -
(int)3.1
seria3
. Existem regras exatas que definem o que acontece quando o valor exato não pode ser mantido.Transmissões do ponteiro - mantenha o endereço da memória, mas mude a maneira como é desreferenciado. Por exemplo, para
float x=3.5
,*(int *)&x
dará1080033280
- esse número inteiro é representado pelo mesmo padrão de bits que representa o flutuador3.5
.fonte
Keep the memory address, but change the way it's dereferenced.
A desreferenciação de um ponteiro com punção de tipo não está definida. The Standard garante apenas lançando a partirA *
deB *
e para trás irá produzir o mesmoA *
, o que pode não ter sido válido para excluir a referência no 1 º lugar - ou que, seB *
é umchar *
, ele pode ser usado para ler a representação de objeto de qualquer tipo. Para todos os outros tipos, oB *
ponteiro de cancelamento de referência é punção de tipo, UB, e viola o aliasing estrito. De qualquer forma, mesmo que o compilador não tenha descartado o exemplo 2 acima por esse motivo, você está fazendo suposições não portáveis sobre padrões de bitsEm C ++, os vários tipos de conversão podem ser mais explícitos, com o
reinterpret_cast
significado de "tratar esses bytes como se eles já fossem essa outra coisa". Em C, você pode tornar isso absolutamente explícito usando aunion
, a conversão com o(type)
operador tentará manter o resultado numericamente equivalente, até a perda de precisão.fonte
int*
que fosse uma palavra e umachar*
que fossem duas palavras [com o segundo byte selecionando o byte alto ou baixo de uma palavra]. A conversão de um(int*)
para(char*)
exigiria a adição de uma palavra extra, que deveria ser qualquer valor que especificasse o primeiro byte doint
.