HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Общие вопросы по кодингу (https://hlfx.ru/forum/showthread.php?threadid=2860)
Отправлено XaeroX 14-07-2011 в 15:13:
Я объясню чуть иначе.
По дефолту числовые константы имеют тип int. Поэтому сравнение
C++ Source Code:
это неявное приведение типа.
Конечно, умный компилятор легко оптимизирует сравнение с нулем. Если мы пишем
C++ Source Code:
то сравниваем байт с байтом.
В данном случае тип роли не играет, и оба выражения имеют одинаковый смысл. Но так бывает далеко не всегда!
Пример:
C++ Source Code:
unsigned __int64 test = (1 << 40); |
Как думаете, что будет в переменной test? 64-битное число (1<<40)? А вот не тут-то было! И 1, и 40 имеют тип int, а значит, операция сдвига имеет также тип int. Но это число превышает размер 32-битного числа, поэтому в итоге получается 0. Он-то радостно и присваивается 64-битному test-у.
А правильный код выглядит так:
C++ Source Code:
unsigned __int64 test = ((unsigned __int64)1 << 40); |
__________________
Отправлено Дядя Миша 14-07-2011 в 15:19:
Цитата:
XaeroX писал:
А правильный код выглядит так:
следует понимать, что работа с 64-разрядными переменными, вообще имеет массу тонкостей.
То что обязательно для них, вовсе необязательно для 32-битных.
Также приведение типов играет важную роль при русификации и передаче данных по сети.
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено underworlddemon 14-07-2011 в 18:59:
Цитата:
Дядя Миша писал:
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.
это ещё не худший вариант
в НСке при печати Я вылет в винду или зависон компа... как повезёт...
Отправлено KiQ 06-01-2015 в 13:19:
Сорри за некропостинг, но более подходящей темы не нашел. В общем суть такова:
У нас есть некая структура
C++ Source Code:
6 | static somestruct_t somestruct; |
где thing_t в свою очередь выражен
C++ Source Code:
1 | typedef struct thing_t thing_s; |
а в структура other_s в свою очередь:
C++ Source Code:
Вопрос - как получить доступ к переменной number, начиная с somestruct? Я пробовал разные варианты, все они ссылаются на C2228. Последний вариант, который выдает всего одну ошибку:
C++ Source Code:
somestruct.something->other.number; |
Ошибка error C2228: left of '.number' must have class/struct/union type
Я в общем запарился уже, вроде простая задача__________________
-Brain is dead-
Отправлено XaeroX 06-01-2015 в 13:51:
C++ Source Code:
somestruct.something->other->number; |
__________________
Отправлено ComradeAndrew 06-01-2015 в 13:51:
KiQ
other в структуре thing_s является указателем.
C++ Source Code:
somestruct.something->other->number; |
Цитата:
C++ Source Code:
typedef struct thing_t thing_s; |
Разве не наоборот надо?
C++ Source Code:
typedef struct thing_s thing_t; |
Отправлено KiQ 06-01-2015 в 16:52:
Все, спасибо, там оказывается еще дело было в том, что other не был определен, то есть когда он передавался как параметр, все было нормально, а попытка обратиться к его членам выдавала C2027. Подключил нужный инклюд и все заработало
__________________
-Brain is dead-