![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Товарищи, объясните мне кто-нибудь такой феномен:
CODE Program bitstest; {$APPTYPE CONSOLE} Var X: Cardinal; Begin X:=123; X:=X ShR 32; // Должно быть 0... WriteLn(X); // Но остаётся 123 как и было!.. End. X ShR 32 (X >> 32) должно быть 0, т.к. X переменная 32-х разрядная. Но дело в том, что эта операция не работает! Если сделать X >> 31 - то всё ок, но 32 просто ничего не делает - X не изменяется! Сейчас даже на FASM программу написал - такой же результат. Это что за багофича такая?!.. Кстати, если на Си такое сделать, то результат не изменится, но будет предупреждение: warning: right shift count >= width of type Просто есть формула: X:=X ShR (32 - BITS); Которая при BITS = 0, должна давать 0, но из-за этого косяка получается фигня... Кто-нибудь может объяснить почему так? Я ещё понимаю, когда сдвиг больше размера типа, но когда равно - должен же 0 быть?.. Добавлено: Ну, трындец просто (взято отсюда): QUOTE most popular CPUs have only 5 bit shift counts Офигеть!!!И ещё (примерно оттуда же): QUOTE shift count from 0 up to the number of bits in the register-1 Слов нет - одни эмоции. |
Grom PE |
![]()
Сообщение
#3
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) ![]() |
-=CHE@TER=-
Ну дык, процессор так работает, x shr y на самом деле x shr (y mod 32). Надо обнулить переменную, так и пиши =) Точнее, x shr (y and 11111b), что и составляет 5 бит маски. Intel Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 22:04 |