Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странный дефайн
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Встретился мне такой дефайн
Код
#define STATE1  (char)-1
#define STATE2  (char)-2

это как?
arhiv6
Явное приведение типов к char? По-хорошему вместо (char)-1 нужно написать ((char) -1)
Jenya7
Цитата(arhiv6 @ Oct 1 2017, 14:36) *
Явное приведение типов к char? По-хорошему вместо (char)-1 нужно написать ((char) -1)

а что в результате получиться? в коде есть сравнение if (var != STATE2)
получается дефайн выражается определенным десятичным числом. я бы сказал 6 но зачем char?
k155la3
Цитата(Jenya7 @ Oct 1 2017, 12:45) *
а что в результате получиться? в коде есть сравнение if (var != STATE2)
получается дефайн выражается определенным десятичным числом. я бы сказал 6 но зачем char?

А какой тип у var ?
Для корректного сравнения в If величины дб одного типа.
Например, сравнивать арифметически -5 и 0x1234 бессмыслено.
(-5 может быть char, int, long и их бинарный вид будет разный и занимать разное кол-во байт)
В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.
Jenya7
Цитата(k155la3 @ Oct 1 2017, 15:11) *
А какой тип у var ?
Для корректного сравнения в If величины дб одного типа.
Например, сравнивать арифметически -5 и 0x1234 бессмыслено.
(-5 может быть char, int, long и их бинарный вид будет разный и занимать разное кол-во байт)
В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.

var он тоже char. я никогда раньше не видел такого определения. ума не приложу зачем оно понадобилось.
k155la3
Цитата(Jenya7 @ Oct 1 2017, 13:13) *
var он тоже char. я никогда раньше не видел такого определения. ума не приложу зачем оно понадобилось.

Если так, то это какаято платформенно-прикладной ньюанс.
Возможно - из-за того, что char по умолчанию может быть настроен в опциях компилятора и на знаковый, и на беззнаковый.
Если ОНО настроено в компиляторе как беззнаковое - будет выдано warn или ошибка компилятора.
Jenya7
Цитата(k155la3 @ Oct 1 2017, 15:27) *
Если так, то это какаято платформенно-прикладной ньюанс.
Возможно - из-за того, что char по умолчанию может быть настроен в опциях компилятора и на знаковый, и на беззнаковый.
Если ОНО настроено в компиляторе как беззнаковое - будет выдано warn или ошибка компилятора.

понял более не менее. спасибо.
sigmaN
Цитата
В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.
Иногда, это по настроению или как? wink.gif
Читать https://www.securecoding.cert.org/confluenc...onversion+rules
гуглить c integer promotion rules
Сергей Борщ
QUOTE (sigmaN @ Oct 5 2017, 11:02) *
Иногда, это по настроению или как? wink.gif
Иногда - это значит, что знаковость char стандартом не определена. В одном компиляторе по умолчанию он может быть знаковым, а в другом - беззнаковым. Знаковость char по умолчанию может меняться от версии к версии. Для криворуких программистов сделали возможность задавать ее ключами компилятора. Более пряморукие используют char только для хранения символов, для байтов используют (un)signed char. Самые правильные программисты используют char для символов, а для байтов используют uint(_fast|_least)8_t.

В данном случае без явного приведения будет предупреждение, если char вдруг окажется беззнаковым.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.