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

 
 
> Чем отличается uint8_t от unsigned char?
-=Женек=-
сообщение May 14 2010, 19:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Коллеги, переношу проект из WinAVR в KEIL.
Есть переменная uint8_t - в KEIL не прокатывает. Задумался, а чем же по сути она отличается от char. И как ее объявить в KEIL, дабы перенести без минимальных последствий?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 25)
rezident
сообщение May 14 2010, 19:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Тем, что uint8_t имеет конкретно определенную размерность - 8 бит. А unsigned char не имеет определенной размерности. В стандарте Си определено только соотношение char <= short int <= int <= long int. Например, на архитектуре TMS320 в среде CCS тип char 16-и битный.
Для использования типов с определенной привязкой к размеру следует использовать хедер stdint.h.
Go to the top of the page
 
+Quote Post
dch
сообщение May 15 2010, 03:27
Сообщение #3


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(rezident @ May 14 2010, 23:44) *
В стандарте Си определено только соотношение char <= short int <= int <= long int.

четырехбитников мало а доступ к 8 битам есть как правило почти везде.

Сообщение отредактировал dch - May 15 2010, 03:40
Go to the top of the page
 
+Quote Post
Danis
сообщение May 20 2010, 11:29
Сообщение #4


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



UInt8 - An unsigned 8-bit integer. This value maps to the Byte type.

Character Sets Used by Fonts
All fonts use a character set. A character set contains punctuation marks, numerals, uppercase and lowercase letters, and all other printable characters. Each element of a character set is identified by a number.

Most character sets in use are supersets of the U.S. ASCII character set, which defines characters for the 96 numeric values from 32 through 127. There are five major groups of character sets:

Windows
Unicode
OEM (original equipment manufacturer)
Symbol
Vendor-specific

Сообщение отредактировал Danis - May 20 2010, 11:30


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 20 2010, 13:41
Сообщение #5


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

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



Откуда цитата?
И какое отношение она имеет к соотношению размеров типа unsigned char и uint8_t?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
shista
сообщение Jun 12 2010, 19:08
Сообщение #6





Группа: Участник
Сообщений: 12
Регистрация: 15-07-09
Пользователь №: 51 296



Добавьте к инклудам #include <inttypes.h> или #include <stdint.h> и будет Вам счастье...
В AVR-овских исходниках, как правило, также встречается инклуд на один из этих файлов.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Jun 12 2010, 20:07
Сообщение #7


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

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(rezident @ May 14 2010, 22:44) *
Тем, что uint8_t имеет конкретно определенную размерность - 8 бит. А unsigned char не имеет определенной размерности. В стандарте Си определено только соотношение char <= short int <= int <= long int. Например, на архитектуре TMS320 в среде CCS тип char 16-и битный.

Стесняюсь спросить...а на вышеназванной платформе что представляет собой uint8_t? К примеру на армах это: "typedef unsigned char uin8_t". А на tms320 ? cranky.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 13 2010, 09:06
Сообщение #8


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

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



Чстенько компиляторы имеют свои собственные builtin типы данных которыми впоследствии определяются различные другие типы.
Так что размер uint8_t - будет 8 бит (я так думаю) - вопрос насколько эффективен он на такой платформе...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 13 2010, 10:36
Сообщение #9


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Открою Вам маленький секрет smile.gif В stdint.h для C2000 нет ни int8_t ни uint8_t
Есть только int_least8_t и uint_least8_t, которые, как и полагается, 16ти битные.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 13 2010, 10:55
Сообщение #10


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

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



Интересный ход. Нет человека - нет проблем!:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 13 2010, 16:06
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну не может он обеспечить 8бит никак!
там sizeof(char) == 1
Можно только побайтово перебрать массив с помощью intrinsic т.е. он там грузит в AL 16бит, а потом можно обратиться к старшему и младшему байту как к двум 8ми битным регистрам. На этом 8ми битность заканчивается smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 14 2010, 04:53
Сообщение #12


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(sigmaN @ Jun 13 2010, 23:06) *
там sizeof(char) == 1

А где иначе? smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
baralgin
сообщение Jun 14 2010, 05:47
Сообщение #13


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

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(dxp @ Jun 14 2010, 07:53) *
А где иначе? smile.gif

Это была опечатка. Как раз равно 2 smile.gif
Go to the top of the page
 
+Quote Post
baralgin
сообщение Jun 14 2010, 06:50
Сообщение #14


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

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



легкий поиск гуглом и оказывается таки 1, как и int...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 14 2010, 07:20
Сообщение #15


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Это была опечатка. Как раз равно 2
именно 1.
В принципе то да, sizeof(char) всегда 1, но тут то это не 8бит, а 16 smile.gif в этом вся "фишка"
Написал я про размер char для того, чтобы было понятно, что и не может там быть int8_t т.к. чему же тогда равнялся бы его sizeof? 0.5 что-ли smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 14 2010, 09:52
Сообщение #16


Гуру
******

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



Цитата(sigmaN @ Jun 14 2010, 10:20) *
но тут то это не 8бит, а 16 smile.gif в этом вся "фишка"
Да простят меня ReAl и dxp:
Цитата
Одно время для многих "программируемый микроконтроллер" и "MCS51"
были тождественными понятиями, хотя как-то другие были. Сейчас
для подавляющего большинства "персональная ЭВМ"==="клон IBM PC"

Так и с байтом. Многие забыли, что он не есть синонимом "8-битный
огрызок". Я сам уже склонен считать, что "байт==8бит" имеет
степень достоверности порядка той же, что "short==16бит" (может даже
выше) но ещё не стал бы считать, что иное невозможно в принципе (как
невозможно "октет==9бит", и там где 8 бит *важно* - применяют это
термин). И пока ещё достаточно следов того, что не все считают
"байт==8бит" абсолютной истиной.

© Philips Semiconductors, 1995
The I2C-bus and how to use it (including specifications)
6.0 TRANSFERRING DATA
6.1 Byte format
Every byte put on the SDA line must be 8-bits long.

"must be 8-bits" означает, как минимум, что в других местах
не исключено и другое.

HZ> сказать, что байт - это, в общем случае, непонятно какое количество бит.
"сем-восемь, максимум девять, ну никак не больше десяти" :-)

HZ> Про
HZ> него известно только то, что это величина для измерения информации и
Величина для измерения - бит, а не байт. А байт - он как ярд.
Есть yd = 0.9144м(точно). А есть несколько более короткий UK
и несколько более длинный US.

HZ> состоит из
HZ> некоторого произвольного количества бит. Только в этом случае полезность
HZ> такого
HZ> понятия обратно пропорциональна определенности количества бит в нем.
"осмысленный по длине огрызок (bite :-) машинного слова, с которым можно
работать отдельно".

Толкового словаря нет под рукой? А то у меня только украинского языка,
а это для многих не просто не аргумент, а аргумент в противоположную сторону :-)

"байт - частина машинного слова, що складаеться звичайно з 8 бiт ..."
ЗВИЧАЙНО, а не ОБОВ'ЯЗКОВО.

Поскольку сейчас типично иметь машинное слово из числа бит, являющегося
степенью двойки - то и байт типично 8 бит. Маловероятно, что в ближайшем
будущем байт перестанет иметь степень_двойки бит.
Вероятность того, что он станет 16-битным -- тоже мизерна, но уже выше
(перейдут все на unicode - кому нужна будет единица памяти, которая
хранит какие-то зачуханные пол-символа? :-)
Или вообще - станет длиной в три трита :-)

wbr,
--
/* Oleksandr Redchuk, Brovary, Ukraine */
/* real '\x40' real '\x2E' kiev '\x2E' ua */


--------------------
На любой вопрос даю любой ответ
"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
demiurg_spb
сообщение Jun 14 2010, 10:04
Сообщение #17


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

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



Цитата(sigmaN @ Jun 13 2010, 20:06) *
Ну не может он обеспечить 8бит никак!
Я бы смог (правда с выравниванием по границе слова или даже скорее с упаковкой двух (u)int8_t в слово,
что усложнит компилятору индексацию массивов и работу с указателями).
И они бы могли обеспечить математику для (u)int8_t с ограничением в 8 бит (с доп расходами естественно).
Но не стали заморачиваться из-за отсутствия жизненной необходимости в этом.

Выход всегда можно найти - вопрос затратности...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 14 2010, 10:13
Сообщение #18


Гуру
******

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



Цитата(demiurg_spb @ Jun 14 2010, 13:04) *
Я бы смог
А как быть с *((volatile *)adddress)? Оно неизбежно будет "задевать" соседний байт, который вероятнее всего тоже volatile и несанкционированное чтение которого может привести к недопустимым с точки зрения компилятора последствиям.


--------------------
На любой вопрос даю любой ответ
"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
=GM=
сообщение Jun 14 2010, 10:25
Сообщение #19


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(sigmaN @ Jun 13 2010, 15:06) *
Ну не может он обеспечить 8бит никак!
Можно только побайтово перебрать массив с помощью intrinsic т.е. он там грузит в AL 16бит, а потом можно обратиться к старшему и младшему байту как к двум 8ми битным регистрам. На этом 8ми битность заканчивается smile.gif

Вообще-то в семействе С2000 есть парные инструкции типа MOVB AX.LSB,LOC16, позволяющие работать с байтами.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 14 2010, 11:59
Сообщение #20


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

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



Цитата(Сергей Борщ @ Jun 14 2010, 14:13) *
А как быть с *((volatile *)adddress)?
Как обычно - критическая секция.
Да я и говорю, что слишком много геморроя.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 14 2010, 18:44
Сообщение #21


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



ггг. Геморрой не стоит свеч biggrin.gif
и если это volatile - там никакие критические секции вроде как не помогут. Вы всё равно считаете не нужный байт. Или я чего-то не понимаю....
В общем как тут не извращайся, а полноценного ТИПА ДАННЫХ не получить.
Побайтовый доступ через MOVB AX.LSB,LOC16 - нет проблем. даже интринсик есть. Кажется __byte(int *ptr, int byte); или как-то так. Лень смотреть точно.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 14 2010, 20:06
Сообщение #22


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

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



Цитата(sigmaN @ Jun 14 2010, 22:44) *
и если это volatile - там никакие критические секции вроде как не помогут.
Помогут, помогут.
Цитата
Вы всё равно считаете не нужный байт. Или я чего-то не понимаю....

Ну и считаю я лишний байт и что?
Я же не из SFR области это по большей части делаю, где ещё могут быть варианты да и то очень маловероятно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 14 2010, 22:25
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(demiurg_spb @ Jun 14 2010, 16:04) *
Но не стали заморачиваться из-за отсутствия жизненной необходимости в этом.
"Жизненная необходимость" обычно возникает в байт-ориентированных протоколах.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2010, 06:03
Сообщение #24


Гуру
******

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



Цитата(demiurg_spb @ Jun 14 2010, 23:06) *
Помогут, помогут.
Сказав "А" говорите "Б". Мне тоже непонятно, чем они могут помочь. Опишите механизм.
Цитата(demiurg_spb @ Jun 14 2010, 23:06) *
Ну и считаю я лишний байт и что?
А автор такого компилятора, значит, где-то в описании должен написать "ну и не будет программа работать правильно, ну и что?"
Цитата(demiurg_spb @ Jun 14 2010, 23:06) *
Я же не из SFR области это по большей части делаю...
А компилятор об этом знает? Для него есть стандарт: "чтение volatile может вызвать изменение состояния абстрактной машины". Все. Точка. Даже если это не SFR.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jun 15 2010, 08:31
Сообщение #25


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вот цитата из словаря.
Цитата
byte (Computer En)
[techspeak] n. A unit of memory or data equal to the amount used to represent one character; on modern architectures this is usually 8 bits, but may be 9 on 36-bit machines. Some older architectures used 'byte' for quantities of 6 or 7 bits, and the PDP-10 supported 'bytes' that were actually bitfields of 1 to 36 bits! These usages are now obsolete, and even 9-bit bytes have become rare in the general trend toward power-of-2 word sizes.

Historical note: The term originated in 1956 during the early design phase for the IBM Stretch computer; originally it was described as 1 to 6 bits (typical I/O equipment of the period used 6-bit chunks of information). The move to an 8-bit byte happened in late 1956, and this size was later adopted and promulgated as a standard by the System/360 . The term 'byte' was coined by mutating the word 'bite' so it would not be accidentally misspelled as bit. See also nybble.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 15 2010, 09:37
Сообщение #26


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

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



Цитата(Сергей Борщ @ Jun 15 2010, 10:03) *
Сказав "А" говорите "Б". Мне тоже непонятно, чем они могут помочь. Опишите еханизм.
Что значит чем? - Обеспечат атомарность доступа к "спаренной" ячейке памяти.

Цитата
А автор такого компилятора, значит, где-то в описании должен написать "ну и не будет программа работать правильно, ну и что?"
А компилятор об этом знает? Для него есть стандарт: "чтение volatile может вызвать изменение состояния абстрактной машины". Все. Точка. Даже если это не SFR.
Покажите мне пожалуйтса на пальцах как это "изменение состояния абстрактной машины" возможно для внутреннего ОЗУ из не SFR области!!!
А к SFR нефиг обращаться побайтно - так и написал бы в документации. Всё - никаких проблем.

Спор на самом деле бесполезен.
То что сделать 100% отвечающую стандарту реализацию "для всех случаев жизни" невозможно - я это понимаю,
но для 99% основных применений всё же возможно!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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