Да, чё там объяснять, холивар как всегда из ничего вылез.
Давай я тебе скажу конкретно по твоему посту, а в свару не полезу.
Вот ты пишешь.
DetSimen пишет:
По умолчанию, в Си тип char - знаковый
Это распространённое заблуждение, вернее, устаревшие сведения. Так было во времена K&R. Уже в С'99 (и уж тем более в C'18) это не так. Вот тут уже полоскалась ссылка на С'99. Открой страницу 47 (по файлу, по нумерации она 35-ая) и посмотри первый абзац и примечание 35 к нему. Как видишь в языке не определено знаковый тип char или беззнаковый - это оставлено на реализацию и в примечании даже написано как определить какой тебе попался.
Там есть ещё одно очень важное замечание в примечании: независимо от того как реализован char (знаково или беззнаково) char, signed char и unsigned char - это три разных типа и char по любому не является синонимом никакого из двух оставшихся. Эта же мысль ещё более чётко высказана в С++'17: "Plain char, signed char, and unsigned char are three distinct types" (6.9.1(1)). Заметь, с int'ом и long'ом это не так, а char вот такой особенный.
Что же касается всего остального, то в языке как таковом (хоть в C, хоть в C++) нет никаких byte, uint8_t. Он определены в реализации так, как определены и чего их обсуждать?.Ты сам в любой программе свои типы определяешь, так у них такой же статус. как и у byte - о чём говорить-то? Как определили, так и определили.
Другое дело, что в С++ (в отличие от С) есть интересные типы char16_t и char32_t (5.1 на стр. 28 - список ключевых слов). Повторяю, они есть именно в языке, а не в реализации. Вот на них как раз и делаются расширенные (и переменной длины) UTF'ы.
Слава богу, что intN_t / uintN_t оставили в C17/C18 c exact width, а то я уж подумал, что реформы и до него добрались: "7.20.1.1 Exact-width integer types ..."
Немножечко в дополнение к сказанному: на AVR тип char реализован как знаковый, а на ARM - как беззнаковый. Так что даже в пределах только Ардуины неопределенность типа проявляется во всей красе. Поэтому программы надо писать так, чтобы им было безразлично, знаковым или беззнаковым типом является char.
Ну, например, в какой-то теме про кириллические шрифты рекомендовался код, в котором переменная типа char сравнивалась на больше/меньше с нулем. Так делать не следует, если нужно проверить старший бит, то именно старший бит и нужно проверять, не предполагая, что он является знаковым.
Знаковый или нет char задается в настройках компилятора. Конкретно gcc
-funsigned-char
Заменяет любой неквалифицированный специально тип char на unsigned char. Без этой опции по умолчанию char соответствует signed char.
И так было всегда и везде. Тока опции в названии менялись. Это всегда было некоторой, но не большой проблемой (не собрался чужой код и похоже ругается на char - не нужно думать, меняем настройку на противоположную и пробуем). Потому кстати и в стандарте char ни на один из вариантов не опирается, потому как ХЗ что там програмер у ся настроит. И почему по умолчанию знаковый тож понятно - опция сама не впишется в проект. Бардак и очень древний, все привыкли.
Это твое личное мнение не совпадающее с мнением разработчиков нашего компилятора. Я привел цитату перевода описаний опций. Почему он не соответствует вообще, но соответствует у каждого конкретного проекта думаю всем ясно. Ну кроме одаренных ;)
Это не моё личное мнение, а стандарт языка (и С, и С++). Точные цитаты из стандартов, где это прямо написано, с указанием страниц приведены выше в #53. Впрочем, я понимаю, что настоящим "одарённым" прогерам стандарт - не авторитет - они пользуются википедией.
Не авторитет конечно. Стандарт мне ни один проект не собрал. А gcc собрал. Стандарты стали крутить как хотят, особенно в последнее время и они теперь - ни о чем. Что и подтверждает это обсуждение. И VC мне проекты собирает. Изучай реальность - https://docs.microsoft.com/en-us/previous-versions/0d294k5z%28v%3dvs.85%29 Стандарты потом под неё поправят. Это не сложно. Это не софт писать.
Да, уж холивар тут у вас. Главное, с умным видом привлекает С99 - хотя в ардуино используется С++, а концепции char в C и C++ совершенно различны!
Обьясните нам, смертным?
Да, чё там объяснять, холивар как всегда из ничего вылез.
Давай я тебе скажу конкретно по твоему посту, а в свару не полезу.
Вот ты пишешь.
Это распространённое заблуждение, вернее, устаревшие сведения. Так было во времена K&R. Уже в С'99 (и уж тем более в C'18) это не так. Вот тут уже полоскалась ссылка на С'99. Открой страницу 47 (по файлу, по нумерации она 35-ая) и посмотри первый абзац и примечание 35 к нему. Как видишь в языке не определено знаковый тип char или беззнаковый - это оставлено на реализацию и в примечании даже написано как определить какой тебе попался.
Там есть ещё одно очень важное замечание в примечании: независимо от того как реализован char (знаково или беззнаково) char, signed char и unsigned char - это три разных типа и char по любому не является синонимом никакого из двух оставшихся. Эта же мысль ещё более чётко высказана в С++'17: "Plain char, signed char, and unsigned char are three distinct types" (6.9.1(1)). Заметь, с int'ом и long'ом это не так, а char вот такой особенный.
Что же касается всего остального, то в языке как таковом (хоть в C, хоть в C++) нет никаких byte, uint8_t. Он определены в реализации так, как определены и чего их обсуждать?.Ты сам в любой программе свои типы определяешь, так у них такой же статус. как и у byte - о чём говорить-то? Как определили, так и определили.
Другое дело, что в С++ (в отличие от С) есть интересные типы char16_t и char32_t (5.1 на стр. 28 - список ключевых слов). Повторяю, они есть именно в языке, а не в реализации. Вот на них как раз и делаются расширенные (и переменной длины) UTF'ы.
По умолчанию, в Си тип char - знаковый...
Что я делаю не так?
результат:
Ну вот, теперь понятно хоть, что в толкователи стандартов я не гожусь. Спасибо.
to nik182 - сдаюсь, признаЮ, что был неправ, пал жертвой горьких заблуждений. :)
Слава богу, что intN_t / uintN_t оставили в C17/C18 c exact width, а то я уж подумал, что реформы и до него добрались: "7.20.1.1 Exact-width integer types ..."
Ну вот, теперь понятно хоть, что в толкователи стандартов я не гожусь. Спасибо.
to nik182 - сдаюсь, признаЮ, что был неправ, пал жертвой горьких заблуждений. :)
меня интересует только одно, если чары сложить, что будет, говорил жеж лживый ваш СИ...а другого нет )))
По умолчанию, в Си тип char - знаковый...
Что я делаю не так?
результат:
Кстати да, хоть числа одни и те же *char и *byte действительно разные типы. Сегодня столкнулся с этим когда передавал их в сериал.
На примере понятней стало что за типы у них). byte это код символов, а char сами символы.
Немножечко в дополнение к сказанному: на AVR тип char реализован как знаковый, а на ARM - как беззнаковый. Так что даже в пределах только Ардуины неопределенность типа проявляется во всей красе. Поэтому программы надо писать так, чтобы им было безразлично, знаковым или беззнаковым типом является char.
Ну, например, в какой-то теме про кириллические шрифты рекомендовался код, в котором переменная типа char сравнивалась на больше/меньше с нулем. Так делать не следует, если нужно проверить старший бит, то именно старший бит и нужно проверять, не предполагая, что он является знаковым.
Знаковый или нет char задается в настройках компилятора. Конкретно gcc
-funsigned-char
Заменяет любой неквалифицированный специально тип char на unsigned char. Без этой опции по умолчанию char соответствует signed char.
И так было всегда и везде. Тока опции в названии менялись. Это всегда было некоторой, но не большой проблемой (не собрался чужой код и похоже ругается на char - не нужно думать, меняем настройку на противоположную и пробуем). Потому кстати и в стандарте char ни на один из вариантов не опирается, потому как ХЗ что там програмер у ся настроит. И почему по умолчанию знаковый тож понятно - опция сама не впишется в проект. Бардак и очень древний, все привыкли.
"char" и "signed char" - разные типы. Ничто ничему не соответствует. Правильно было сказать "char является знаковым"
Это твое личное мнение не совпадающее с мнением разработчиков нашего компилятора. Я привел цитату перевода описаний опций. Почему он не соответствует вообще, но соответствует у каждого конкретного проекта думаю всем ясно. Ну кроме одаренных ;)
Это твое личное мнение
Это не моё личное мнение, а стандарт языка (и С, и С++). Точные цитаты из стандартов, где это прямо написано, с указанием страниц приведены выше в #53. Впрочем, я понимаю, что настоящим "одарённым" прогерам стандарт - не авторитет - они пользуются википедией.
Не авторитет конечно. Стандарт мне ни один проект не собрал. А gcc собрал. Стандарты стали крутить как хотят, особенно в последнее время и они теперь - ни о чем. Что и подтверждает это обсуждение. И VC мне проекты собирает. Изучай реальность - https://docs.microsoft.com/en-us/previous-versions/0d294k5z%28v%3dvs.85%29 Стандарты потом под неё поправят. Это не сложно. Это не софт писать.
Ну, я, собственно, так и думал. С Новым Годом тебя!
И тебе наилучшего! Старайся без криминала в наступившем!