Вы можете сделать это легко с struct
:
high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]
Здесь high_word
является bytes
объект (или str
в 2.x), состоящий из четырех наиболее значимых байтов x
в маленьком порядке Endian (используя 64-битный формат с плавающей запятой IEEE). Затем мы распаковываем его обратно в 32-битное целое число (которое возвращается в одноэлементном кортеже, следовательно, [0]
).
Это всегда использует мало-endian для всего, независимо от базовой сущности вашей платформы. Если вам нужно использовать встроенный указатель, замените <
на =
(и используйте >
или !
, чтобы заставить большой endian). Он также гарантирует 64-битные удвоения и 32-битные ints, что C не делает. Вы можете удалить эту гарантию, но нет веских оснований для этого, так как это делает ваш вопрос бессмысленным.
Хотя это можно было бы сделать с помощью арифметики указателя, она включала бы беспорядок с ctypes
, и преобразование с плавающей точки Python в C float было бы относительно дорогостоящим. Код struct
намного легче читать.
Используйте 'struct.pack()', чтобы превратить его в строку байтов. – Kevin
Почему бы вам не ответить на ваши вопросы? – zell