Не на всех платформах покатит. Есть такие, где sizeof(char) == sizeof(short). А есть такие, где sizeof(char) == sizeof(int). В смысле, что домнажать нужно не на 8 уже, а на 16 или 32.
Я не про неизвестность размера, а про то, что мы не оперируем им в работе как значением. Т.е. какой бы регистр или ячейку памяти нам бы ни дали - мы должны ассемблерными операциями проверить её старший бит. Выгядит притянутым за уши (собственно так оно и есть), но всё же интересен результат :) metar вполне годное решение предложил
>какой бы регистр или ячейку памяти нам бы ни дали - мы должны ассемблерными операциями проверить её старший бит
Ассемблерные операции работают всегда с конкретным регистром конкретной разрядности. Так что старший бит всегда можно проверить по
mov eax, $test
asl eax
>Ассемблерные операции работают всегда с конкретным регистром конкретной разрядности
Я не про конкретные регистры, а про общий алгоритм действий, шаблон так сказать. Чтобы в вашем примере можно было заменить eax на ax или al, или вообще на rx для amd64.
да, всё верно, но я хотел средствами более высокоуровневого ЯП, надо было сразу поставить слово «ассемблерный» в кавычки. В общем я просто хотел красивого решения этой задачи без сравнений с нулём и оперирования размерностью типа, желательно с побитовыми операциями. Извиняюсь за нечёткий критерий, писал в спешке.
Не на всех платформах покатит. Есть такие, где sizeof(char) == sizeof(short).
эээ. sizeof вроде выдает размер в байтах, а не в условных единицах = sizeof(char)
другое дело - машины, где байт был равен 4 битам, но они были ритуально уничтожены, а все свидетели убиты, дабы не наводить смуты в подростающее поколение))