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

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

gcc slon.c -Wpointer-sign
slon.c: In function ‘main’:
slon.c:9:10: warning: pointer targets in assignment from ‘signed char *’ to ‘char *’ differ in signedness [-Wpointer-sign]
    9 |   p_char = p_schar;
      |          ^
slon.c:10:10: warning: pointer targets in assignment from ‘unsigned char *’ to ‘char *’ differ in signedness [-Wpointer-sign]
   10 |   p_char = p_uchar;
gcc slon.cpp
slon.cpp: In function ‘int main()’:
slon.cpp:9:12: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
    9 |   p_char = p_schar;
      |            ^~~~~~~
      |            |
      |            signed char*
slon.cpp:10:12: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
   10 |   p_char = p_uchar;
      |            ^~~~~~~
      |            |
      |            unsigned char*

В С режиме получили предупреждение. Но только если указать -Wpointer-sign, иначе молча проглатывает. По сути в С тип char является "гипотетическим" и "полиморфным", ведущим себя либо как signed char, либо как unsigned char. И как абстрактная сущность он отличается от конкретных signed char и unsigned char. Предупреждение тут уместно скорее именно как предупреждение, чтобы не использовали char там, где нужны числовые типы, а не символьные.

В С++ режиме без всяких -W и прочего сразу по умолчанию ошибка. Потому что тут char -- отдельный самостоятельный, конкретный тип.

По-моему, разница в поведении компиляторов более чем очевидна.

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


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

6 часов назад, juvf сказал:

razrab83 - вы наверно свою "интернатуру" проходили в 00-ые и наверно на ПК аля Intel. Так и было, gcc на этой архитектуре по дефолту char как signed char. 

Но это не то чтобы "не все компиялторы так делают", это один и тот же компилятор на разных архитектурах может иметь разный результат.

Да, так и есть. Я знаю, что стандарт не определяет char знаковый или нет, и это отдано на откуп компиляторам. И да, я писал для х86. Я знаю, что gcc без указаний char интепретирует его как signed char. Вернее там, где я писал - там так и было. И более того, во всяких учебниках/справочниках по СИ - кругом "диапазон char от -128 до +127". Ни какого упоминания о компиляторах и/или архитектурах и что что-то может быть не так. И кто-бы мог подумать, что переехав с десктопа на малину, оставаясь всё в том же linux и с тем же gcc и той же версии - char поменяет знак!? 

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


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

1 час назад, dxp сказал:

В С++ режиме без всяких -W и прочего сразу по умолчанию ошибка. Потому что тут char -- отдельный самостоятельный, конкретный тип.

Потому что в C++ типизация гораздо строже, чем в Си. Только лишь поэтому. А без строгой типизации, например, невозможна корректная перегрузка функций.

То же самое относится к попытке присвоить указателю на char адрес объекта типа int, например.

Так что конкретно char тут не особенный.

Что в Си, что в C++ это три разных типа.
 

10 минут назад, razrab83 сказал:

И более того, во всяких учебниках/справочниках по СИ - кругом "диапазон char от -128 до +127". Ни какого упоминания о компиляторах и/или архитектурах и что что-то может быть не так...

Потому что все книжки пишутся так, чтобы не было желания их закрыть после прочтения первой страницы.

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


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

4 минуты назад, razrab83 сказал:

во всяких учебниках/справочниках по СИ - кругом "диапазон char от -128 до +127". Ни какого упоминания о компиляторах и/или архитектурах и что что-то может быть не так. И кто-бы мог подумать, что переехав с десктопа на малину, оставаясь всё в том же linux и с тем же gcc и той же версии - char поменяет знак!? 

Он может поменять не только знак, но и размер.

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


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

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

Он может поменять не только знак, но и размер.

можно пример, где char в с/с++ поменяет размер?

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


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

1 hour ago, dimka76 said:

Еще раз.

Проведите такой эксперимент на своем компиляторе

Провёл. Как и ожидалось, компилятор С++ потребовал сделать явное приведение типов, что логично, потому что char может быть как знаковым, так и безнаковым в зависимости от реализации.

АЛУ процессора умеет работать только с двумя типами целочисленных данных, знаковым и безнаковым, поэтому третьего типа данных размером в один байт "просто char" помимо "signed char" и "unsigned char" не_может быть в принципе.

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


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

8 минут назад, tonyk_av сказал:

АЛУ процессора умеет работать только с двумя типами целочисленных данных, знаковым и безнаковым...

АЛУ процессора знать не знает о каких-то там знаках. Это мы, человеки, придумали способ представлять знаковые как определенный диапазон значений, представимых в битовом поле определенной разрядности.
 

23 минуты назад, razrab83 сказал:

можно пример, где char в с/с++ поменяет размер?

Скачайте какой-нибудь компилятор на DSP-процессор. Вот там.

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


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

В 05.08.2023 в 16:01, Arlleex сказал:

На примере FreeRTOS (это достаточно известное ПО?) я все показал.

Спасибо за пример, лишний раз убедился, что порядок include не должен влиять на собираемость проекта. Есть ещё примеры? что то там про аппаратные вычислители....

В 08.08.2023 в 10:39, Arlleex сказал:

Так в чем я не прав?

razrab83 говорит

В 06.08.2023 в 18:18, razrab83 сказал:

если ни каких специальных указаний компилятору не давать - char знаковый.

Вы его отсылаете к стандарту. Причем тут стандарт?

В 08.08.2023 в 10:39, Arlleex сказал:

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

а зачем? Если стандарт не определяет знаковость char - зачем к нему отсылать? Можно отослать к ГК РФ или к правилам ПДД - они тоже этого не утверждают. А кто или что интерпретирует char как знаковый или беззнаковый при компиляции? КОМПИЛЯТОР!!! (кто-то скажет архитектура... я бы поспорил, но не буду) Что-бы там не писали в стандарте, в ГК РФ, в ПДД или в этих ваших справочниках и учебниках, сколько бы вы тут постов не писали и какие бы пункты из стандарта не копипастили - мануал на компилятор IAR говорит ровно то, что делает IAR компилятор. By default, the compiler interprets the plain char type as unsigned. Интерпретирует plain char как unsigned. Пусть по стандарту 3 типа, пусть эти типы независимы, пусть будет 5 типов, пусть 2.... пусть даже стандарт утвердит char == signed char - компилятор будет интерпретирует plain char как unsigned. И не правы вы в том, что набрасываете на вентилятор ....., вместо того чтобы открыть и/или отослать к мануалу.

 

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


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

17 минут назад, juvf сказал:

вместо того чтобы открыть и/или отослать к мануалу.

К мануалу на какой из кучи известных ныне компиляторов отсылать? IAR говорит, что по-умолчанию char беззнаковый, GCC под x86 - знаковый. И?

Прозвучало утверждение, что если компилятору никаких флагов не задавать, char - знаковый. Максимально универсальный способ доказать, что это не так - отсылка к стандарту, но никак не к документации на компилятор. Стандарт прямо говорит: знаковость зависит от реализации. А документация на компиятор что говорит? У меня написано, что беззнаковый, у дяди Пети - знаковый. Ну что, помог мануал на компилятор?
 

Цитата

И не правы вы в том, что набрасываете на вентилятор

Да нет, это просто вы читаете мои посты через призму предвзятости и тут уже совершенно не важно, что я пишу.

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


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

10 hours ago, juvf said:

зачем к нему отсылать?

Потому что стандарт, хоть и не определяет данную позицию, всё же на самом деле определяет: говорит, что это уже компетенция компилятора. Другими словами, стандарт языка - это верховный документ, с которого нужно начинать исследования всех вопросов языка программирования. И при необходимости спускаться по иерархической лестнице вниз до документа на конкретный инструмент.

10 hours ago, juvf said:

И не правы вы в том, что набрасываете на вентилятор ....., вместо того чтобы открыть и/или отослать к мануалу.

Модератор: Ваша нижняя цитата уже несколько похожа на флуд. Прошу далее придерживаться темы и вести аргументированную беседу.

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


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

В 08.08.2023 в 21:44, Arlleex сказал:

К мануалу на какой из кучи известных ныне компиляторов отсылать?

к обоим. вы говорите - "знаковость зависит от реализации", razrab83 говорит "в реализации реализовано char знаковый". вы опять "знаковость зависит от реализации", razrab83 - "реализация знаковая".... и по кругу, пока juvf не сказал "razrab83, реализация бывает разная, вот смотри знаковая, а вот беззнаковая". Вопрос закрыт. 

В 08.08.2023 в 21:44, Arlleex сказал:

вы читаете мои посты через призму предвзятости

вместо отсылки на документацию хотябы одного компилятора, где char беззнаковый, вы "предвзято"

В 06.08.2023 в 19:47, Arlleex сказал:

Вы стандарт давно (или вообще хоть раз) открывали?

косвенно оскорбляя по профессиональному признаку, а это нарушение п.2.1.а и 2.1.д.

В 08.08.2023 в 15:39, Arlleex сказал:

Потому что все книжки пишутся так, чтобы не было желания их закрыть после прочтения первой страницы.

А это не предвзятый ответ, намекая на то, что razrab83 дальше 1-ой страницы справочник не читал? (опять нарушение п 2.1.а). Ну я уверен , что вы книжки читаете до конца, и тем более справочники по С++. Подскажите пожалуйста, на какой странице упомянутого выше "Полный справочник по C++ (2015) Автор: Герберт Шилдт" говориться, что диапазон char может быть от 0 до 255, или что char может меняться от  –2147483648 до 2147483647?

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


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

43 минуты назад, ericN сказал:

razrab83 говорит "в реализации реализовано char знаковый".

Да что вы? Прям так и говорил? С чего все началось, напоминаю

В 04.08.2023 в 12:42, razrab83 сказал:

По дефолту в си он знаковый.

 

43 минуты назад, ericN сказал:

вместо отсылки на документацию хотябы одного компилятора, где char беззнаковый

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

Цитата

косвенно оскорбляя по профессиональному признаку, а это нарушение п.2.1.а и 2.1.д.

Если аргументированная критика воспринимается с большими душевными страданиями, в интернет вообще лучше никогда не ходить.
 

Цитата

А это не предвзятый ответ, намекая на то, что razrab83 дальше 1-ой страницы справочник не читал?

Вот говорю же - вы уже негативите в мою сторону, соответственно, уже и смысл мною написанного коверкаете в свою пользу.

@razrab83 писал (по смыслу), мол, почему в книжках не пишут всех деталей, в том числе implementation-defined особенностей языка.

Я сказал, что если бы авторы писали обо всех таких особенностях, любая книжка превратилась бы в нечитаемый справочник, который лишь отпугивает пытающихся его осилить.

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


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

50 минут назад, Arlleex сказал:

Да что вы? Прям так и говорил?

В 06.08.2023 в 18:18, razrab83 сказал:

По дефолту, т.е. если ни каких специальных указаний компилятору не давать - char знаковый.

 

50 минут назад, Arlleex сказал:

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

не сказал бы. не аргумент.

50 минут назад, Arlleex сказал:

@razrab83 писал (по смыслу), мол, почему в книжках не пишут всех деталей, в том числе implementation-defined особенностей языка.

вот смотрите, на вскидку, цитата из справочника по СИ, Бочков и Субботин

image.thumb.png.d0c240762a216475bcb18d3e6914aede.png

Ниже коментарии....

Цитата

Тип char интерпретируется как однобайтовое целое с областью значений от -128 до 127.

....

Следует отметить, что представление в памяти и область значений для типов int и unsigned int не определены в языке Си.

и далее много текста про то, какой может быть int и как зависит от архитектуры. 

Т.е. для int показали "деталей, в том числе implementation-defined", а для char нет. Как читатель должен понимать, из этого, что char - тоже зависит от реализации? Меня это и удивило. 

Изменено пользователем razrab83

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


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

13 минут назад, razrab83 сказал:

Т.е. для int показали "деталей, в том числе implementation-defined", а для char нет. Как читатель должен понимать, из этого, что char - тоже зависит от реализации? Меня это и удивило. 

Ну не захотел писать автор об этом, а может не знал или просто забыл. Большинство книг пишутся как душа располагает.

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


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

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

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

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

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

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

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

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

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

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