Текущий архив: 2011.12.25;
Скачать: CL | DM;
Вниз
программирование IncDay-style Найти похожие ветки
← →
TUser © (2011-09-04 21:16) [40]А зачем делают переменную в цикле беззнакового типа? Приключений в жизни мало?
← →
Игорь Шевченко © (2011-09-04 22:05) [41]TUser © (04.09.11 21:16) [40]
Всякое бывает нужно, зависит от других параметров цикла.
Например в цикле
for I:=одно беззнаковое значение to другое беззнаковое значение do
I должна быть объявлена без знака.
← →
asail © (2011-09-04 23:26) [42]
> Игорь Шевченко © (04.09.11 22:05) [41]
> I должна быть объявлена без знака
Не понял... Почему "должна"? Чем такое плохо?
var i: Integer;
for i := 1 to 10 do something;
> TUser © (04.09.11 21:16) [40]
> А зачем делают переменную в цикле беззнакового типа?
Напрмер, если нужен цикл, скажем, на 200 итераций... Можно взять беззнаковый Byte или знаковый Integer, что явно излишне. Ну, или где-то надо брать знаковый Int64 вместо Cardinal (Integer может быть недостаточно)... Но, конечно, при сегодняшних объемах памяти кто будет такое ерундой заморачиваться?
← →
Германн © (2011-09-04 23:45) [43]
> Напрмер, если нужен цикл, скажем, на 200 итераций... Можно
> взять беззнаковый Byte или знаковый Integer, что явно излишне.
>
В большом числе случаев разницы вообще никакой не будет. Да и самой этой переменной в исполняемом коде не будет.
← →
Inovet © (2011-09-05 00:04) [44]> [42] asail © (04.09.11 23:26)
> Не понял... Почему "должна"? Чем такое плохо?
> var i: Integer;
> for i := 1 to 10 do something;
for i := a to b do something;
a и b могут быть беззнаковые целые
← →
Германн © (2011-09-05 00:08) [45]
> for i := a to b do something;
> a и b могут быть беззнаковые целые
Сделай тестовый пример. Скомпилируй. Поставь брейк на цикл и посмотри CPU View.
← →
Inovet © (2011-09-05 00:21) [46]> [45] Германн © (05.09.11 00:08)
> Сделай тестовый пример. Скомпилируй. Поставь брейк на цикл
> и посмотри CPU View.
Я там увижу что-то экзотическое? Надо посмотреть.
← →
asail © (2011-09-05 00:22) [47]
> Германн © (04.09.11 23:45) [43]
> В большом числе случаев разницы вообще никакой не будет
В случае Byte и Integer, действительно не будет, а в случае Cardinal и Int64 - думаю, будет.
← →
Германн © (2011-09-05 00:30) [48]
> Я там увижу что-то экзотическое? Надо посмотреть.
А то ты не помнишь многочисленные удивлённые вопросы новичков про то, что "типа я задал цикл от 0 до 5, а в отладчике вижу что цикл выполняется в обратном порядке от 5 до 0".
Под переменную цикла в Дельфи очень часто вообще не выделяется память. Ибо нафиг, если её значение не влияет на то, что выполняется в теле цикла.
← →
Германн © (2011-09-05 00:44) [49]
> Игорь Шевченко © (04.09.11 22:05) [41]
>
> TUser © (04.09.11 21:16) [40]
>
> Всякое бывает нужно, зависит от других параметров цикла.
>
> Например в цикле
>
> for I:=одно беззнаковое значение to другое беззнаковое значение
> do
>
> I должна быть объявлена без знака.
>
???
← →
Игорь Шевченко © (2011-09-05 00:53) [50]Игорь Шевченко © (04.09.11 22:05) [41]
Был неправ.var
I: Cardinal;
begin
for I := $7FFFFFFF to $80000001 do
...;
end;
var
I: Integer;
begin
for I := $7FFFFFFF to $80000001 do
...;
end;
не выполняются ни разу
← →
Inovet © (2011-09-05 01:09) [51]> [48] Германн © (05.09.11 00:30)
> Под переменную цикла в Дельфи очень часто вообще не выделяется память.
Я не о том
> [50] Игорь Шевченко © (05.09.11 00:53)
> не выполняются ни разу
Что ли I всегда знаковая?
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
a, b : Cardinal;
begin
a := $fffffffe;
b := $ffffffff;
for i := a to b do ShowMessage(IntToStr(i));
end;
Почему нет предупреждения о присвоении беззнакового знаковому?
-2, -1
Не идентично, но похоже по смыслу
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
unsigned int a, b;
a = 0xfffffffe;
b = 0xffffffff;
for (i = a; i <= b; i++)
{
ShowMessage(i);
}
}
хотя бы получаю [BCC32 Warning] Unit1.cpp(23): W8012 Comparing signed and unsigned values
и цикл
-2, -1, 0, 1, ...
← →
Игорь Шевченко © (2011-09-05 01:13) [52]
> Почему нет предупреждения о присвоении беззнакового знаковому?
есть.var
I: Integer;
begin
for I := $80000000 to $80000001 do
...;
end;
[Pascal Warning] main.pas(35): W1012 Constant expression violates subrange bounds
А так - нету:var
I: Cardinal;
begin
for I := $80000000 to $80000001 do
...;
end;
← →
Германн © (2011-09-05 01:17) [53]
> Inovet © (05.09.11 01:09) [51]
>
> > [48] Германн © (05.09.11 00:30)
> > Под переменную цикла в Дельфи очень часто вообще не выделяется
> память.
>
> Я не о том
>
>
Ну как же не о том?
Именно о том!
Ты не исходник на СИ приводи. Ты посмотри на "исполняемый код"!
← →
Inovet © (2011-09-05 01:17) [54]> [52] Игорь Шевченко © (05.09.11 01:13)
> есть.
>
> var
> I: Integer;
> begin
> for I := $80000000 to $80000001 do
> ...;
> end;
А с переменными беззнаковыми вместо констант.
← →
Inovet © (2011-09-05 01:23) [55]> [53] Германн © (05.09.11 01:17)
> Ты посмотри на "исполняемый код"!
Смотрел, вычитается нижняя граница из верхней сохраняется в сщётчик, и отдельно переменная цикла имеется.
Unit1.pas.31: a := $fffffffe;
004BD9D7 C745F4FEFFFFFF mov [ebp-$0c],$fffffffe
Unit1.pas.32: b := $ffffffff;
004BD9DE C745F0FFFFFFFF mov [ebp-$10],$ffffffff
Unit1.pas.33: for i := a to b do ShowMessage(IntToStr(i));
004BD9E5 8B45F4 mov eax,[ebp-$0c]
004BD9E8 8B55F0 mov edx,[ebp-$10]
004BD9EB 2BD0 sub edx,eax
004BD9ED 7C22 jl $004bda11
004BD9EF 42 inc edx
004BD9F0 8955EC mov [ebp-$14],edx
004BD9F3 8945F8 mov [ebp-$08],eax
004BD9F6 8D55E4 lea edx,[ebp-$1c]
004BD9F9 8B45F8 mov eax,[ebp-$08]
004BD9FC E877E8F5FF call IntToStr
004BDA01 8B45E4 mov eax,[ebp-$1c]
004BDA04 E8AB9EFEFF call ShowMessage
004BDA09 FF45F8 inc dword ptr [ebp-$08]
004BDA0C FF4DEC dec dword ptr [ebp-$14]
004BDA0F 75E5 jnz $004bd9f6
← →
Игорь Шевченко © (2011-09-05 01:30) [56]
> 004BD9ED 7C22 jl $004bda11
Для случая беззнаковых переменных должно быть
jb $004bda11
← →
Германн © (2011-09-05 01:56) [57]
> Inovet © (05.09.11 01:23) [55]
>
> > [53] Германн © (05.09.11 01:17)
> > Ты посмотри на "исполняемый код"!
>
> Смотрел, вычитается нижняя граница из верхней сохраняется
> в сщётчик, и отдельно переменная цикла имеется.
Ещё вопросы есть?
:)
А ты убери из кода ShowMessage.
← →
Inovet © (2011-09-05 02:41) [58]> [57] Германн © (05.09.11 01:56)
> Ещё вопросы есть?
Что присвоишь, то и получишь.
← →
Anatoly Podgoretsky © (2011-09-05 10:32) [59]> Игорь Шевченко (05.09.2011 01:13:52) [52]
Так первый случай вообще то бессмысленный, 0 иттераций, в отличии от
второго.
Кроме того у кодогенератора Дельфи есть проблемы с граничными значениями
Integer, а тут одно из них - MinInt
Страницы: 1 2 вся ветка
Текущий архив: 2011.12.25;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.011 c