реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> в чем отличие uint8_t от char?
Метценгерштейн
сообщение Jan 18 2013, 11:14
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



могу ли я всегда использовать uint8_t ? ведь оба беззнаковые и оба 8 бит.
и в программе вывода текста в UART uint8_t работает прекрасно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 18 2013, 11:27
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



char по умолчанию знаковый тип, более того его размерность заранее не известна...
Насчёт знаковости я погорячился, она тоже может меняться от реализации...
Его единственное назначение - это строки и символы. Для всего остального есть stdint.h.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jan 18 2013, 23:49
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(Метценгерштейн @ Jan 18 2013, 15:14) *
могу ли я всегда использовать uint8_t


Советую просто прочитать что стандарт говорит про это и посмотреть на то, что можно выиграть от uint_fast8_t, например (на проектах, переносимых между ARM и AVR).
Каждому из типов своё применение.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 19 2013, 01:22
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Genadi Zawidowski @ Jan 19 2013, 03:49) *
... и посмотреть на то, что можно выиграть от uint_fast8_t, например (на проектах, переносимых между ARM и AVR).


Много тут не выиграешь, а скорее проиграешь.

Тип char крепко прижился в языке, т.к. на него все стринги завязаны, то бишь текстовые строки. Совсем обойтись без строковых сообщений сложно, а если их использовать, то окажется, что все строковые аргументы у библиотечных функций объявлены именно как char, а не иначе. Самим же написать что-то типа форматного printf'а слабО. А форматная печать (когда текст перемежается с цифирью) нужна бывает очень часто. А каждый раз сращивать такую строку из кусочков текста и чисел утомительно.

Конечно, буквам все равно где лежать, в char'ах или uint8_t'ах, однако строковые функции хотят только char, а всякий раз явно переопределять тип аргументов накладно.

Возможно из-за этого многие ... не пользуются ни тем, ни другим sm.gif, а выдумывают свои обозначения типов, отсутствующие в стандарте языка, которые с помощью дефайна (#define) определяют в заголовке программы должным образом. Чаще всего это типы:
i8, i16, i32
и их беззнаковые аналоги:
u8, u16, u32
Поэтому при переходах с одной архитектуры на другую, бывает достаточно только переопределить эти самодельные типы, не производя правку в алгоритмах. А то после того, как в некоторых архитектурах char стал двухбайтым, положиться стало не на что. И тут проявляет себя слабая сторона языка C/C++, когда типы переменных определены не строго, а в зависимости от архитектуры процессора. Эта особенность полезна, чтобы использовать язык, как кроссассемблер, но вредна, когда ставит работу алгоритмов в зависимость от этого.

Впрочем, проблему взаимодействия со стриговыми функциями этот метод не решает. Но если это C++, то всегда можно доопределить аналоги стринговых функций, с готовностью пожирающие аргументы типа i8 и u8 вместо char. На то полиморфизм и нужен. sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 19 2013, 11:31
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Xenia @ Jan 19 2013, 03:22) *
Много тут не выиграешь, а скорее проиграешь.
Ксения, расскажите, пожалуйста, про проигрыш? В чем он выражается конкретно? Я знаю и могу рассказать вам о выигрыше.

QUOTE (Xenia @ Jan 19 2013, 03:22) *
Конечно, буквам все равно где лежать, в char'ах или uint8_t'ах, однако строковые функции хотят только char, а всякий раз явно переопределять тип аргументов накладно.
Вы смешали в кучу все, что только можно. char используется для того, о чем говорит его название: для хранения символов. Массивы charов - для последовательностей символов, т.е. строк. Строковые функции предназачены для работы со строками, поэтому будьте любезны передавать им указатель на char.

Если нужно работать со знаковыми или беззнаковыми числами и вы хотите их уложить в такой же размер памяти, какую занимает char - будьте добры использовать signed char или unsigned char. Для уменьшения писанины - объявленные в stdint.h типы int8_t и uint8_t. А вот если вы хотите с этими числами поработать как с символами используя строковые функции - то это явно нетрадиционное использование чисел и должно быть выделено явным преобразованием типа. И проблемы исчезнут, а программа станет читаемой и будет компилироваться без ошибок и предупреждений вне зависимости от того, как создатели компилятора представляют себе char по-умолчанию - знаковым или беззнаковым (имеют право!).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Hamster1979
сообщение Jan 23 2013, 05:30
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-03-05
Пользователь №: 3 697



ИМХО - char всегда пишу если подразумевается строка или символ, всякие uint8 и прочая - для хранения данных в опрделенной размерности бит и указания знака, для переносимости проектов на разные целевые платформы.
Go to the top of the page
 
+Quote Post
yes
сообщение Jan 23 2013, 10:19
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



у приличных людей строки это массивы wchar_t уже давно sm.gif

я, например, предпочитаю char, в совсем сложных случаях добавляю signed, unsigned. ну не люблю я uint8_t и остальные типы с того инклуда
разницы никакой

-----

например для 55х тмсов (и наверняка для других странных архитектур) где char 16 бит стока надо переделывать в исходниках, что эта разница значения практически не имеет

Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 23 2013, 11:58
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(yes @ Jan 23 2013, 14:19) *
например для 55х тмсов (и наверняка для других странных архитектур) где char 16 бит стока надо переделывать в исходниках, что эта разница значения практически не имеет

Например что переделывать (конкретно)?
Я как раз-то и агитирую за использование по назначению типа char (только для строк и символов),
а то, что лично вы не используете типы из <stdint.h>, так это лично ваши предпочтения.
Мне очень нравится, к примеру, в небольших циклах использовать в качестве счётчика тип uint_fast8_t - получается оптимально и для кортексов, и для авр8, и для x86.
И переделывать ничего не надо. Если вы ещё не смогли оценить эту возможность - очень жаль.
Ну и насчёт wchar_t, вы тоже слегка преувеличиваете, так например в avr-gcc вообще как класс отсутствуют <wchar.h> и <wctype.h>,
а для работы с winapi TCHAR более уместен. Видите как оно бывает? Я бы сказал что в первую очередь от фреймворка стоит отталкиваться при выборе традиционных для него типов: в Qt одно в BCB другое в VS третье.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
yes
сообщение Jan 23 2013, 17:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



бывает и кроме win и авр-а программирование, не правда ли?

а использовать char или uint8_t - дело вкуса, я никаких претензий к пользователям stdint.h не предьявляю

по поводу архитектур с нестандартными размерами long, short, char и т.п. там кроме этого еще много всего нестандартного. ну и арифметика с указателями - да, ес-сно в ней ошибки
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 23 2013, 17:36
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(yes @ Jan 23 2013, 21:23) *
бывает и кроме win и авр-а программирование, не правда ли?
Несомненно. Полно и 8-ми и 16-ти разрядных архитектур, а сейчас и 64-ёх битники от ARM на подходе, так что всё только начинаетсяsm.gif
Конечно можно найти какие-либо нестандартные фишки при заточке компилятора под ту или иную архитектуру, но 99% программы можно и ИМХО нужно писать с прицелом на повторное использование на различных платформах. Чему и сопутствует <stdint.h>.
Вот и всё что я хотел сказать.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 23 2013, 17:49
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Самый рекордсмен по кривизне - это тип int sm.gif
Что до stdint.h - их пользовать желательно там, где размер и поведение типов стандартизованы, говорили об этом тыщу раз.
Что такое "стандартизованное поведение"? А я и сам не знаю, допускаю только, что к typedef unsigned char uint8_t можно добавить еще какие-либо атрибуты, но до этого дело пока не дошло. И хорошо, неча мозг утомлять.
Ну и например какой-нить протокол связи, пакет которого описывается структурой. Совершенно очевидно, что для нормальной работы "и там и сям" надо пользоваться stdint.h а не всякой чепухой.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 28 2013, 15:34
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Во, вчера нарвался в исходниках v-usb:
CODE
char    i;
...
    i = len;
    do{                         /* if len == 0, we still copy 1 byte, but that's no problem */
        *p++ = *data++;
    }while(--i > 0);            /* loop control at the end is 2 bytes shorter than at beginning */

И ни дай бог компилятор решит, что char по умолчанию беззнаковый...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jan 31 2013, 15:05
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



можно этому верить?
Статья на Хабре
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 31 2013, 15:43
Сообщение #14


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата
От типов вроде int16_t, со строгим указанием размера, страдает переносимость

Чувак не вкуривает, для чего exact-width - типы нужны.
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Feb 20 2013, 08:22
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



char по умолчанию не является ни знаковым, ни беззнаковым. Каким он будет, зависит от платформы. Это единственный тип, для которого наличие знака не определено стандартом. Сам попадал в неудобную ситуацию, когда char оказался знаковым.
Поэтому лучше всегда пользоваться типами с определенной размерностью stdint.h. Это избавит вас от проблем знаковости и некоторых проблем портируемости кода из-за разных размерностей типов на разных платформах. Мне попадался char = int = long размером 32 бит на одной из платформ.

Цитата(yes @ Jan 23 2013, 21:23) *
по поводу архитектур с нестандартными размерами long, short, char и т.п. там кроме этого еще много всего нестандартного. ну и арифметика с указателями - да, ес-сно в ней ошибки


Архитектур с нестандартными размерами long, short, char и т.п. мне еще не встречалось. Ибо в стандарте указано лишь соотношение long>= int >= char. Следовательно, размер long и char может совпадать.
Ошибки чаще всего не в компиляторах, а в программистах, которые не знают как средствами языка (например, stdint) пользоваться

Сообщение отредактировал Misile_Inc - Feb 20 2013, 08:32
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016