dxp 53 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба В чём вы видите противоречие? Что char чаще по умолчанию знаковый? Реализация имеет право. А по-хорошему приличный компилятор должен выдавать предупреждение, когда char используется в арифметике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 154 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 22 минуты назад, dxp сказал: Строго говоря, текст сноски противоречит смыслу основного пункта. В сноске сказано, что, типа, char является отдельным типом, но в основном пункте сказано, что его поведение или как у знакового, или как у беззнакового, а если это так, то он сам по себе никаких отдельных свойств не несёт и по сути является псевдонимом signed char или unsigned char. Ну, и странно, что такую важную вещь написали где-то в сноске мелким шрифтом. В С++ это прямо сказано в основном тексте без намёков и экивоков. Еще раз пункт Цитата 6.2.5 Types 14 The type char, the signed and unsigned integer types, and the floating types are collectively called the basic types. The basic types are complete object types. Even if the implementation defines two or more basic types to have the same representation, they are nevertheless different types. (что уже как бы намекает, что это разные типы, раз их перечисляют), но Вы почему-то отрицаете это: ладно, стандарты нужно трактовать однозначно, поэтому (там же) Цитата 17 The type char, the signed and unsigned integer types, and the enumerated types are collectively called integer types. The integer and real floating types are collectively called real types. 17 пункт говорит, что char - это целый тип. 14 пункт говорит, что char, а так же любые знаковые и беззнаковые целые (т.е. signed / unsigned char в том числе (см. 17 пункт)) - базовые типы. И в не зависимости от реализации и их (возможно) одинакового представления - они являются разными типами. Все еще не однозначно? 16 минут назад, dxp сказал: В чём вы видите противоречие? Что char чаще по умолчанию знаковый? Видимо, имелись в виду опечатки типа -127. 36 минут назад, jcxz сказал: Имхо: именно в этом причина разницы в дефолтной знаковости char у компиляторов для разных платформ. Даже у одного и того же компилятора (GCC). На то оно и implementation defined Вчера ни в одном из онлайн-компиляторов (для разных архитектур) не добился, чтобы plain char был беззнаковым. Открыл первый компилятор на десктопе - вуаля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 45 minutes ago, juvf said: char 8 −127 to 127 unsigned char 8 0 to 255 signed char 8 −127 to 127 -128 .. 127 для char. -128 .. 127 для signed char. Странно, что в той книге так написано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 154 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 22 минуты назад, haker_fox сказал: -128 .. 127 для char. -128 .. 127 для signed char. Странно, что в той книге так написано. Ну, строго говоря, реализация может определять, в том числе, и способ представления чисел со знаком, поэтому, наверное, где-то можно встретить компиляторы, где signed char будет -127...127 и математика с дополнением до 1 Но я таких не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 36 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 1 hour ago, Arlleex said: (что уже как бы намекает, что это разные типы, раз их перечисляют) Это почему это разные? Для signed char и unsigned char явно указано наличие или отсутствие знака, а для просто char- нет, что, по-моему, указывает на то, что в зависимости от реализации компилятора и его опций он может быть как знаковым, так и безнаковым. Так что разновидностей char две, а способов записи три. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 154 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба Только что, tonyk_av сказал: Это почему это разные? Для signed char и unsigned char явно указано наличие или отсутствие знака, а для просто char- нет, что, по-моему, указывает на то, что в зависимости от реализации компилятора и его опций он может быть как знаковым, так и безнаковым. Так что разновидностей char две, а способов записи три. Мне уже очень наскучивает по 10 раз приводить цитаты из стандарта. Пожалуйста, просмотрите еще раз 6 и 7 страницу этого топика. По-моему, предельно исчерпывающе стандарт все говорит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 45 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба On 8/8/2023 at 11:23 AM, Arlleex said: Ну, строго говоря, реализация может определять, в том числе, и способ представления чисел со знаком, поэтому, наверное, где-то можно встретить компиляторы, где signed char будет -127...127 и математика с дополнением до 1 Но я таких не знаю. Есть такой волшебный файлик limits.h On 8/8/2023 at 11:30 AM, tonyk_av said: Это почему это разные? Для signed char и unsigned char явно указано наличие или отсутствие знака, а для просто char- нет, что, по-моему, указывает на то, что в зависимости от реализации компилятора и его опций он может быть как знаковым, так и безнаковым. Так что разновидностей char две, а способов записи три. Еще раз. Проведите такой эксперимент на своем компиляторе unsigned char * p_uchar; signed char * p_schar; char * p_char; int main(void) { p_char = p_schar; p_char = p_uchar; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 154 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 3 минуты назад, dimka76 сказал: Есть такой волшебный файлик limits.h Их есть у меня. Но толку? Вы видели компилятор, который выполнял бы арифметику со знаком в числах с обратным кодом (а не дополнительным)? Я - нет... А стандарт говорит, мол, реализация может такое допускать. Т.е. где-то, возможно, существует #define SCHAR_MIN -127. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 53 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 1 час назад, Arlleex сказал: Еще раз пункт Цитата 6.2.5 Types 14 The type char, the signed and unsigned integer types, and the floating types are collectively called the basic types. The basic types are complete object types. Even if the implementation defines two or more basic types to have the same representation, they are nevertheless different types. (что уже как бы намекает, что это разные типы, раз их перечисляют), но Вы почему-то отрицаете это: ладно, стандарты нужно трактовать однозначно, поэтому (там же) Цитата 17 The type char, the signed and unsigned integer types, and the enumerated types are collectively called integer types. The integer and real floating types are collectively called real types. 17 пункт говорит, что char - это целый тип. 14 пункт говорит, что char, а так же любые знаковые и беззнаковые целые (т.е. signed / unsigned char в том числе (см. 17 пункт)) - базовые типы. И в не зависимости от реализации и их (возможно) одинакового представления - они являются разными типами. Все еще не однозначно? Разумеется нет. 🙂 Из этих всех фраз следует, что char относится к целым типам, что char относится к базовым типам, но ни разу не следует, что char, signed char и unsigned char являются разными типами. В п.15 прямо говорится, что тип char при реализации фактически является либо signed char'ом, либо unsigned char'ом. Единственное что как-то более-менее явно указывает на то, что char является отдельным от других типом, -- это упомянутая вами сноска (там присутствует слово Separate). Но по смыслу это, имхо, противоречит п.15. А однозначно -- это в стандарте С++: "Plain char, signed char, and unsigned char are three distinct types". И не в сноске, а в основном тексте. Если в С так же, что мешало именно так и написать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 154 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба Только что, dxp сказал: Если в С так же, что мешало именно так и написать? Например, разные группы в комитете ISO/IEC, которые это писали. Даже внутри одного языка в стандартах разных версий что-то дописывается, что-то переписывается, в том числе и для улучшения трактовки. Цитата Разумеется нет. 🙂 Тогда я пас Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 45 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба On 8/8/2023 at 12:02 PM, dxp said: Разумеется нет. 🙂 Из этих всех фраз следует, что char относится к целым типам, что char относится к базовым типам, но ни разу не следует, что char, signed char и unsigned char являются разными типами. В п.15 прямо говорится, что тип char при реализации фактически является либо signed char'ом, либо unsigned char'ом. Единственное что как-то более-менее явно указывает на то, что char является отдельным от других типом, -- это упомянутая вами сноска (там присутствует слово Separate). Но по смыслу это, имхо, противоречит п.15. А однозначно -- это в стандарте С++: "Plain char, signed char, and unsigned char are three distinct types". И не в сноске, а в основном тексте. Если в С так же, что мешало именно так и написать? А как тогда вы прокомментируете мой пример, приведенный выше ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 154 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба Только что, dimka76 сказал: А как тогда вы прокомментируете мой пример, приведенный выше ? Однозначно сейчас будут доводы, мол компиляторы нынче смешивают C++/C-правила при компиляции Поэтому Ваш пример обработал умный анализатор C++, а не Си. Ну-ну)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба В 08.08.2023 в 14:08, dimka76 сказал: А как тогда вы прокомментируете мой пример, приведенный выше ? а как вы тогда прокомментируете мой пример, приведённый выше, в котором plain char компилятор рассматривает как signed char? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 45 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба On 8/8/2023 at 12:12 PM, juvf said: а как вы тогда прокомментируете мой пример, приведённый выше, в котором plain char компилятор рассматривает как signed char? Ваш пример затрагивает аппаратную часть. А АЛУ знает только знаковые числа и беззнаковые, поэтому ваш char обработался как знаковый. А у меня чистая абстракция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба хотел добавить, не успел.... а как вы прокомментируете мануал на с\с++ иара Цитата By default, the compiler interprets the plain char type as unsigned. В 08.08.2023 в 14:14, dimka76 сказал: А у меня чистая абстракция. так весь сыр бор начался с того, чтобы в IDE не ставить галку "char is unsigned". Весь спор не за сухую абстракцию стандартов, а за то, как пишу программы. И исполняемый код выполняет АЛУ, которое char обработает как знаковое или нет. От этого будет зависить результат работы программы, а не от пунктов и формулировок в стандарте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться