Re[10]: Попинайте арифметику
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.06.14 17:19
Оценка:
Здравствуйте, watchmaker, Вы писали:

M>>Меня собственно, интересует такая версия:

M>>
static inline void mul128(uint64_t a, uint64_t b, uint64_t& hi, uint64_t &lo) {
M>>    uint128_t t = a;
M>>    lo = t *= b;
M>>    hi = t >> 64;
M>>}

W>Хорошо, так что тут конкретно интересует?
W>Под архитектуру x86-64 это пример компилируется gcc, clang, icc. После компиляции — та же единственная инструкция умножения, только имена регистров другие.

Мне бы для MSVC 2005

W>Или ты намекаешь, что раз в текущем стандарте языка не упомянут тип uint256_t, то такой подход не масштабируется на гипотетические 128-битные процессоры?

А что, в текущем стандарте uint128_t уже есть?

W>Ну так так всегда будет — сначала вводится платформо-зависимое расширение (в данном случае типы вроде __uint256_t или __uint128_t), а потом уже это попадает в стандарт (да и то, только если достаточно широко начинает использоваться).

Было бы хорошо в стандарте иметь функции/операции для арифметики, с проверкой переполнения. Во всех железных архитектурах так или иначе какие-то флаги выставляются, а из C++, да и из C, до них не добраться. Большой недостаток для языка, который декларирует поддержку самых низкоуровневых деталей.Имхо, конечно. "C", вон, вообще как "переносимый асм" декларируется, а таких нужных фич нет.

W>Всё-таки языки C/C++ тем и отличаются, что в стандарте не описывается единственно верное поведение, в вместо этого существует, например, implementation defined behaviour. Это, конечно, не добавляет переносимости программам, но уж такой язык. В С++ ведь не только длины целых чисел меняются, так даже two's complement представление знаковых не гарантируется. Да даже размер байта не всегда 8 бит (и так действительно бывает). С этой точки зрения у тебя в программу уже содержится явно непереносимые операции вроде mask <<= 8;. Хочешь определённости и переносимости — пиши на какой-нибудь Java, а не на C++. А на С/C++ тебе самому придётся задумываться о том, является ли, например, long int 32-битным или 64-битным числом, и что твоя программа будет делать если таки не является.


О первом выделенном — помню, лень было искать, как называется количество бит на байт в limits
По второму — мне особо не интересно, какие там у чего размеры реально. Мне интересно отслеживать факты переполнения при операциях с моими данными.
А что, в Java такие вещи можно отслеживать? Или там исключениями будут кидаться?
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.