Разыменование символьного указателя дает вам первый символьный фрагмент внутреннего представления 1000 как целое число.Затем этот символ был переведен в int
(согласно правилам для аргументов varidac) и интерпретирован как целое число.
На вашем компьютере с этим компилятором результат был -24.
* 1005Блок символов размером
вероятно 8-битный байт.
Целое число было вероятно , представленное 4 или 8 из этих байтов.
внутреннее представление было вероятно 2s-дополнением, и вероятно хранилось в порядке с прямым порядком байтов.
Вы начинаете понимать, почему результат не был легким для васпредсказание?
То же самое с помощью указателя с плавающей точкой вернуло чак памяти размером float
вместо char
, и теперь у вас может быть real (хех!) проблема, потому что мы не знаем, на данный момент, будет ли представление float
даже соответствовать представлению int
, поэтому вы можете обращаться к неинициализированной памяти.
В любом случае, когда вы разыменовываетеfloat*
он интерпретировал эту память как float
(который имеетболее сложную внутреннюю структуру, чем символ или даже целое число, дополняющее 2s), и преобразовал ее в double
(эти правила для аргументов varidac снова) , затем была предпринята попытка интерпретировать это представление как целое число(и если float
соответствует вписывается в int
, double
, вероятно, не , так что вы интерпретируете часть удваивается как int!).Тьфу.
Эта ситуация еще хуже, чем в прошлом, потому что она включает стандарты представления с плавающей запятой IEEE и два шанса, что размеры не будут совпадать вообще.
Итак, урок здесь такой:
Не делайте этого.
И вспомогательный урок, только для экспертов, это
Все же не делайте этого.
, потому что если вы хотитечтобы выполнить все эти глупые реинтерпретации, вы хотите иметь точный и явный контроль над ними.