Конференція vbstreets - перегляд теми - помилка overflow

Порівнюються не два однакових значення. Треба просто правильно будувати думка.

Отже.
Два різнотипних значення ніколи не можна порівняти. Ніде. Завжди всюди при порівнянні різнотипних величин одна з величин конвертується так, щоб тип став однаковий. Так? Наприклад якщо порівнювати, Double і Byte, то Byte перетворюється в Double, і буде порівняння двох Double-ів. Якщо порівнюється рядок і число, то або число конвертується в рядок, і порівнюються два рядки, або рядок в число, і порівнюється два числа (залежить від мови, що будь-що).






Завжди різнотипні величини перетворюються в однотипні, і тільки потім однотипні порівнюються.

З цим буде хтось сперечатися? Ніхто.

Далі. Тут ми маємо два різнотипних значення. Перш ніж їх порівняти, необхідно «привести до спільного знаменника» (зробити їх однотипними). Оскільки наводяться «до більшого», то Integer перетворюється в Long, а не навпаки. Після того, як Integer перетворюється в Long, ми маємо два неоднакових Long-числа.

Все вкрай логічно.

-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.

Qwertiy писал (а): А якщо так: Код: Виділити все puts (0x80000000LL == 0x80000000. "Yes". "No"); Константа без суфікса має unsigned int, константа з суфіксом LL signed long long. Робиться неявне приведення обох до unsigned long long і виходить true.


Емм. Це у тебе підгін під результат, а не у Хакера. У нього взято ТІ САМІ типи, що і у варіанті, який написаний для VB, а у тебе - інші. Більш "місткі".







label:
cli
jmp label

iGrok писал (а): Емм. Це у тебе підгін під результат, а не у Хакера. У нього взято ТІ САМІ типи, що і у варіанті, який написаний для VB, а у тебе - інші. Більш "місткі".


Справа не в розмірності, а в явному приведення. У варіанті на VB є одна шістнадцяткова константа без вказівки типу і одна константа із зазначенням типу long. Мій код показує той же принцип - константа без мітки типу і константа знакового типу більшої розмірності. У коді Хакера тип обох констант явно наводиться до знакової перед порівнянням.

Код: Виділити все puts (0x80000000LL == 0x80000000. "Yes". "No");
puts ((long long) 0x80000000 == (int) 0x80000000. "yes". "no"); Перший результат yes, а другий - no

Можна скомпілювати для long і int 16-розрядних компілятором
Суть в тому, що шістнадцятиричні і восмерічние константи без суфіксів розглядаються в Сі як беззнакові.

Ура! Вийшла нова версія Unreal Commаnder'а!

Qwertiy писал (а): Суть в тому, що шістнадцятиричні і восмерічние константи без суфіксів розглядаються в Сі як беззнакові.

iGrok писал (а): У нього взято ТІ САМІ типи, що і у варіанті, який написаний для VB, а у тебе - інші.

-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.

Qwertiy писал (а): Суть в тому, що шістнадцятиричні і восмерічние константи без суфіксів розглядаються в Сі як беззнакові.

iGrok писал (а): У нього взято ТІ САМІ типи, що і у варіанті, який написаний для VB, а у тебе - інші.


На мій погляд, твоєму варіанту відповідає запис H8000 = H8000%. а не та, яка приведена в питанні.

Ура! Вийшла нова версія Unreal Commаnder'а!

% І так передбачається за замовчуванням. Більш того, якщо ти напишеш свій варіант, то середовище насильно прибере процентний TDC з твоєї записи. Хоча, звичайно, ніхто не забороняє тобі мати свій погляд.

-We separate their smiling faces from the rest of their body, Captain.
-That's right! We decapitate them.

Хакер писал (а):% і так передбачається за замовчуванням


Ось в цьому-то і полягає відмінність VB від Сі, яке ти сховав, поставивши явне приведення.

Ура! Вийшла нова версія Unreal Commаnder'а!







Схожі статті