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

 
 
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
ReAl
сообщение Feb 20 2013, 08:43
Сообщение #16


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Misile_Inc @ Feb 20 2013, 10:22) *
Ибо в стандарте указано лишь соотношение long>= int >= char. Следовательно, размер long и char может совпадать.
Ещё там short в цепочке и ещё short не может быть короче 16 бит.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Feb 20 2013, 09:18
Сообщение #17


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

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



Цитата(ReAl @ Feb 20 2013, 12:43) *
Ещё там short в цепочке и ещё short не может быть короче 16 бит.

"int and short be at least 16 bits and long be at least as long as int and not smaller than 32
bits" если быть точнее. Согласен, это я упустил. Главное, что char может быть много больше, чем программист себе изначально представляет.

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

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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 14:37
Рейтинг@Mail.ru


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