Перейти к содержанию
    

Компилятор IAR 8.5 Си не дает ошибку

В чём вы видите противоречие? Что char чаще по умолчанию знаковый? Реализация имеет право. А по-хорошему приличный компилятор должен выдавать предупреждение, когда char используется в арифметике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 пункт)) - базовые типы. И в не зависимости от реализации и их (возможно) одинакового представления - они являются разными типами.

Все еще не однозначно?:wink: 

 

16 минут назад, dxp сказал:

В чём вы видите противоречие? Что char чаще по умолчанию знаковый?

Видимо, имелись в виду опечатки типа -127.

 

36 минут назад, jcxz сказал:

Имхо: именно в этом причина разницы в дефолтной знаковости char у компиляторов для разных платформ. Даже у одного и того же компилятора (GCC).

На то оно и implementation defined:wink: Вчера ни в одном из онлайн-компиляторов (для разных архитектур) не добился, чтобы plain char был беззнаковым. Открыл первый компилятор на десктопе - вуаля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Странно, что в той книге так написано.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, haker_fox сказал:

-128 .. 127 для char.

-128 .. 127 для signed char.

Странно, что в той книге так написано.

Ну, строго говоря, реализация может определять, в том числе, и способ представления чисел со знаком, поэтому, наверное, где-то можно встретить компиляторы, где signed char будет -127...127 и математика с дополнением до 1:smile:

Но я таких не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

(что уже как бы намекает, что это разные типы, раз их перечисляют)

Это почему это разные? Для signed char и unsigned char явно указано наличие или отсутствие знака, а для просто char- нет, что, по-моему, указывает на то, что в зависимости от реализации компилятора и его опций он может быть как знаковым, так и безнаковым. Так что разновидностей char две, а способов записи три.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, tonyk_av сказал:

Это почему это разные? Для signed char и unsigned char явно указано наличие или отсутствие знака, а для просто char- нет, что, по-моему, указывает на то, что в зависимости от реализации компилятора и его опций он может быть как знаковым, так и безнаковым. Так что разновидностей char две, а способов записи три.

Мне уже очень наскучивает по 10 раз приводить цитаты из стандарта. Пожалуйста, просмотрите еще раз 6 и 7 страницу этого топика. По-моему, предельно исчерпывающе стандарт все говорит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/8/2023 at 11:23 AM, Arlleex said:

Ну, строго говоря, реализация может определять, в том числе, и способ представления чисел со знаком, поэтому, наверное, где-то можно встретить компиляторы, где signed char будет -127...127 и математика с дополнением до 1:smile:

Но я таких не знаю.

Есть такой волшебный файлик 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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, dimka76 сказал:

Есть такой волшебный файлик limits.h

Их есть у меня. Но толку? Вы видели компилятор, который выполнял бы арифметику со знаком в числах с обратным кодом (а не дополнительным)? Я - нет...

А стандарт говорит, мол, реализация может такое допускать. Т.е. где-то, возможно, существует #define SCHAR_MIN -127.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 пункт)) - базовые типы. И в не зависимости от реализации и их (возможно) одинакового представления - они являются разными типами.

Все еще не однозначно?:wink: 

Разумеется нет. 🙂 

Из этих всех фраз следует, что 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". И не в сноске, а в основном тексте. Если в С так же, что мешало именно так и написать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, dxp сказал:

Если в С так же, что мешало именно так и написать?

Например, разные группы в комитете ISO/IEC, которые это писали. Даже внутри одного языка в стандартах разных версий что-то дописывается, что-то переписывается, в том числе и для улучшения трактовки.
 

Цитата

Разумеется нет. 🙂 

Тогда я пас:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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". И не в сноске, а в основном тексте. Если в С так же, что мешало именно так и написать?

А как тогда вы прокомментируете мой пример, приведенный выше ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, dimka76 сказал:

А как тогда вы прокомментируете мой пример, приведенный выше ?

Однозначно сейчас будут доводы, мол компиляторы нынче смешивают C++/C-правила при компиляции:wink: Поэтому Ваш пример обработал умный анализатор C++, а не Си. Ну-ну))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 08.08.2023 в 14:08, dimka76 сказал:

А как тогда вы прокомментируете мой пример, приведенный выше ?

а как вы тогда прокомментируете мой пример, приведённый выше, в котором plain char компилятор рассматривает как signed char? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/8/2023 at 12:12 PM, juvf said:

а как вы тогда прокомментируете мой пример, приведённый выше, в котором plain char компилятор рассматривает как signed char? 

Ваш пример затрагивает аппаратную часть. А АЛУ знает только знаковые числа и беззнаковые, поэтому ваш char обработался как знаковый.

А у меня чистая абстракция.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хотел добавить, не успел.... а как вы прокомментируете мануал на с\с++ иара

Цитата

By default, the compiler interprets the plain char type as unsigned. 

 

В 08.08.2023 в 14:14, dimka76 сказал:

А у меня чистая абстракция.

так весь сыр бор начался с того, чтобы в IDE не ставить галку "char is unsigned". Весь спор не за сухую абстракцию стандартов, а за то, как пишу программы. И исполняемый код выполняет АЛУ, которое char обработает как знаковое или нет. От этого будет зависить результат работы программы, а не от пунктов и формулировок в стандарте. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...