dxp 53 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 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 -- отдельный самостоятельный, конкретный тип. По-моему, разница в поведении компиляторов более чем очевидна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 6 часов назад, juvf сказал: razrab83 - вы наверно свою "интернатуру" проходили в 00-ые и наверно на ПК аля Intel. Так и было, gcc на этой архитектуре по дефолту char как signed char. Но это не то чтобы "не все компиялторы так делают", это один и тот же компилятор на разных архитектурах может иметь разный результат. Да, так и есть. Я знаю, что стандарт не определяет char знаковый или нет, и это отдано на откуп компиляторам. И да, я писал для х86. Я знаю, что gcc без указаний char интепретирует его как signed char. Вернее там, где я писал - там так и было. И более того, во всяких учебниках/справочниках по СИ - кругом "диапазон char от -128 до +127". Ни какого упоминания о компиляторах и/или архитектурах и что что-то может быть не так. И кто-бы мог подумать, что переехав с десктопа на малину, оставаясь всё в том же linux и с тем же gcc и той же версии - char поменяет знак!? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 1 час назад, dxp сказал: В С++ режиме без всяких -W и прочего сразу по умолчанию ошибка. Потому что тут char -- отдельный самостоятельный, конкретный тип. Потому что в C++ типизация гораздо строже, чем в Си. Только лишь поэтому. А без строгой типизации, например, невозможна корректная перегрузка функций. То же самое относится к попытке присвоить указателю на char адрес объекта типа int, например. Так что конкретно char тут не особенный. Что в Си, что в C++ это три разных типа. 10 минут назад, razrab83 сказал: И более того, во всяких учебниках/справочниках по СИ - кругом "диапазон char от -128 до +127". Ни какого упоминания о компиляторах и/или архитектурах и что что-то может быть не так... Потому что все книжки пишутся так, чтобы не было желания их закрыть после прочтения первой страницы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 4 минуты назад, razrab83 сказал: во всяких учебниках/справочниках по СИ - кругом "диапазон char от -128 до +127". Ни какого упоминания о компиляторах и/или архитектурах и что что-то может быть не так. И кто-бы мог подумать, что переехав с десктопа на малину, оставаясь всё в том же linux и с тем же gcc и той же версии - char поменяет знак!? Он может поменять не только знак, но и размер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 2 минуты назад, jcxz сказал: Он может поменять не только знак, но и размер. можно пример, где char в с/с++ поменяет размер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 39 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 1 hour ago, dimka76 said: Еще раз. Проведите такой эксперимент на своем компиляторе Провёл. Как и ожидалось, компилятор С++ потребовал сделать явное приведение типов, что логично, потому что char может быть как знаковым, так и безнаковым в зависимости от реализации. АЛУ процессора умеет работать только с двумя типами целочисленных данных, знаковым и безнаковым, поэтому третьего типа данных размером в один байт "просто char" помимо "signed char" и "unsigned char" не_может быть в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 8 минут назад, tonyk_av сказал: АЛУ процессора умеет работать только с двумя типами целочисленных данных, знаковым и безнаковым... АЛУ процессора знать не знает о каких-то там знаках. Это мы, человеки, придумали способ представлять знаковые как определенный диапазон значений, представимых в битовом поле определенной разрядности. 23 минуты назад, razrab83 сказал: можно пример, где char в с/с++ поменяет размер? Скачайте какой-нибудь компилятор на DSP-процессор. Вот там. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба В 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. И не правы вы в том, что набрасываете на вентилятор ....., вместо того чтобы открыть и/или отослать к мануалу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 17 минут назад, juvf сказал: вместо того чтобы открыть и/или отослать к мануалу. К мануалу на какой из кучи известных ныне компиляторов отсылать? IAR говорит, что по-умолчанию char беззнаковый, GCC под x86 - знаковый. И? Прозвучало утверждение, что если компилятору никаких флагов не задавать, char - знаковый. Максимально универсальный способ доказать, что это не так - отсылка к стандарту, но никак не к документации на компилятор. Стандарт прямо говорит: знаковость зависит от реализации. А документация на компиятор что говорит? У меня написано, что беззнаковый, у дяди Пети - знаковый. Ну что, помог мануал на компилятор? Цитата И не правы вы в том, что набрасываете на вентилятор Да нет, это просто вы читаете мои посты через призму предвзятости и тут уже совершенно не важно, что я пишу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба 10 hours ago, juvf said: зачем к нему отсылать? Потому что стандарт, хоть и не определяет данную позицию, всё же на самом деле определяет: говорит, что это уже компетенция компилятора. Другими словами, стандарт языка - это верховный документ, с которого нужно начинать исследования всех вопросов языка программирования. И при необходимости спускаться по иерархической лестнице вниз до документа на конкретный инструмент. 10 hours ago, juvf said: И не правы вы в том, что набрасываете на вентилятор ....., вместо того чтобы открыть и/или отослать к мануалу. Модератор: Ваша нижняя цитата уже несколько похожа на флуд. Прошу далее придерживаться темы и вести аргументированную беседу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ericN 3 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба В 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба 18 часов назад, Arlleex сказал: Ну что, помог мануал на компилятор? очень помог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба 43 минуты назад, ericN сказал: razrab83 говорит "в реализации реализовано char знаковый". Да что вы? Прям так и говорил? С чего все началось, напоминаю В 04.08.2023 в 12:42, razrab83 сказал: По дефолту в си он знаковый. 43 минуты назад, ericN сказал: вместо отсылки на документацию хотябы одного компилятора, где char беззнаковый Допустим, он сказал бы, что у меня компилятор не правильный. Аргумент? Цитата косвенно оскорбляя по профессиональному признаку, а это нарушение п.2.1.а и 2.1.д. Если аргументированная критика воспринимается с большими душевными страданиями, в интернет вообще лучше никогда не ходить. Цитата А это не предвзятый ответ, намекая на то, что razrab83 дальше 1-ой страницы справочник не читал? Вот говорю же - вы уже негативите в мою сторону, соответственно, уже и смысл мною написанного коверкаете в свою пользу. @razrab83 писал (по смыслу), мол, почему в книжках не пишут всех деталей, в том числе implementation-defined особенностей языка. Я сказал, что если бы авторы писали обо всех таких особенностях, любая книжка превратилась бы в нечитаемый справочник, который лишь отпугивает пытающихся его осилить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 9 августа, 2023 Опубликовано 9 августа, 2023 (изменено) · Жалоба 50 минут назад, Arlleex сказал: Да что вы? Прям так и говорил? В 06.08.2023 в 18:18, razrab83 сказал: По дефолту, т.е. если ни каких специальных указаний компилятору не давать - char знаковый. 50 минут назад, Arlleex сказал: Допустим, он сказал бы, что у меня компилятор не правильный. Аргумент? не сказал бы. не аргумент. 50 минут назад, Arlleex сказал: @razrab83 писал (по смыслу), мол, почему в книжках не пишут всех деталей, в том числе implementation-defined особенностей языка. вот смотрите, на вскидку, цитата из справочника по СИ, Бочков и Субботин Ниже коментарии.... Цитата Тип char интерпретируется как однобайтовое целое с областью значений от -128 до 127. .... Следует отметить, что представление в памяти и область значений для типов int и unsigned int не определены в языке Си. и далее много текста про то, какой может быть int и как зависит от архитектуры. Т.е. для int показали "деталей, в том числе implementation-defined", а для char нет. Как читатель должен понимать, из этого, что char - тоже зависит от реализации? Меня это и удивило. Изменено 9 августа, 2023 пользователем razrab83 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба 13 минут назад, razrab83 сказал: Т.е. для int показали "деталей, в том числе implementation-defined", а для char нет. Как читатель должен понимать, из этого, что char - тоже зависит от реализации? Меня это и удивило. Ну не захотел писать автор об этом, а может не знал или просто забыл. Большинство книг пишутся как душа располагает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться