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

 
 
> Как стандартно в Си узнать размер char-а, А соответственно и функции sizeof()
GetSmart
сообщение Aug 20 2009, 17:24
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А напишу-ка я здесь. Прикинусь начинающим.

Столкнулся работая с TMS320 с тем, что у него тип char имеет 2 байта. И (кто бы мог подумать) sizeof() выдаёт размеры переменных тоже в 16 битных словах.
Вопрос: как стандартными методами преобразовать этот размер в байтовый размер, то бишь метод должен одинаково работать на всех платформах, и там где sizeof() байтовый.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Axel
сообщение Aug 20 2009, 19:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Я бы сделал так:

#ifdef TMS320
#define SIZE_OF_CHAR 2
#else
#define SIZE_OF_CHAR 1
#endif

int true_size = SIZE_OF_CHAR * sizeof(char);

хотя смотрится это не вот уж...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 20 2009, 20:33
Сообщение #3


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

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



Цитата(GetSmart @ Aug 20 2009, 20:24) *
Вопрос: как стандартными методами преобразовать этот размер в байтовый размер, то бишь метод должен одинаково работать на всех платформах, и там где sizeof() байтовый.


Код
#include <limits.h>

#define CHAR_BYTES  (CHAR_BIT / 8)


Тьху, позор, срочно исправил на более приличный вариант

Ну если запараноиться на всякие 9-ти битовые char, то, конечно, посложнее надефайнить придётся, а так - размер в битах (и куча другого полезного) лежит в этом самом limits.h

Цитата(Axel @ Aug 20 2009, 22:40) *
int true_size = SIZE_OF_CHAR * sizeof(char);

хотя смотрится это не вот уж...


Код
#define BYTESOF(a)  (CHAR_BYTES * sizeof(a))


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 20 2009, 22:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ReAl @ Aug 21 2009, 00:33) *
Код
#define BYTESOF(a)  (CHAR_BYTES * sizeof(a))

Справедливости ради надо заметить, что так лажа выйдет на платформе с 16-битным char и "честным" sizeof(), возвращающим размер в байтах.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 03:59
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aaarrr @ Aug 21 2009, 04:30) *
Справедливости ради надо заметить, что так лажа выйдет на платформе с 16-битным char и "честным" sizeof(), возвращающим размер в байтах.

Мне тут SM подсказывает, что sizeof() по стандарту должен выдавать размер как раз в char-ах. Вопрос: так ли это на самом деле?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 21 2009, 04:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(GetSmart @ Aug 21 2009, 07:59) *
Мне тут SM подсказывает, что sizeof() по стандарту должен выдавать размер как раз в char-ах. Вопрос: так ли это на самом деле?

По стандарту C99 - в байтах:
Цитата
The sizeof operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type.

и еще вот это интересно:
Цитата
When applied to an operand that has type char, unsigned char, or signed char,
(or a qualified version thereof) the result is 1.
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 21 2009, 04:13
Сообщение #7


Adept
******

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



Цитата(GetSmart @ Aug 21 2009, 10:59) *
Мне тут SM подсказывает, что sizeof() по стандарту должен выдавать размер как раз в char-ах. Вопрос: так ли это на самом деле?

Насколько помню, sizeof возвращает размер в минимально адресуемых единицах на данной платформе. И "байтом" обычно эту минимально адресуемую ячейку памяти и называют, другими словами, на этом TMS'е байт как раз 16 бит. Поэтому sizeof выдает правильный результат. А char может иметь любой размер при условии, что он больше 8 бит. Т.е. может иметь хоть 16, хоть 24, хоть 32. При том, что размер байта на этой же платформе может быть и 8 бит. В общем, это отдано на откуп реализации. Но чаще всего char делают размером с байт (по здравому смыслу), т.к. платформы с минимально адресуемой ячейкой менее 8 бит являются экзотикой (равно как и спец фичи типа битовых процессоров MCS-51).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 21 2009, 04:22
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(dxp @ Aug 21 2009, 08:13) *
другими словами, на этом TMS'е байт как раз 16 бит.

На этом TMS-е есть адресации "low_byte(addr)" и "high_byte(addr)" для команд load/store. Так что байт там как у всех. Как есть и битовые операции типа MCS-51. А вот лень у разработчиков компилятора - явно присутствует в изобилии, для char-а могли бы эти адресации использовать, хотя они и выходят за рамки концепции всей системы команд, являясь ее как бы дополнением.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 21 2009, 04:39
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(dxp @ Aug 21 2009, 08:13) *
А char может иметь любой размер при условии, что он больше 8 бит. Т.е. может иметь хоть 16, хоть 24, хоть 32. При том, что размер байта на этой же платформе может быть и 8 бит.

Тогда несостыковка получается, т.к. явно указывается, что sizeof(char)=1. То есть если у системы восьмибитный байт, то char тоже обязан быть восьмибитным.

Получается, что sizeof возвращает размер в байтах, который равен размеру в char'ах. А байт и char могут иметь любой размер.
Так что SM прав, посыпаю голову пеплом smile.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 04:54
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aaarrr @ Aug 21 2009, 10:39) *
Тогда несостыковка получается, т.к. явно указывается, что sizeof(char)=1. То есть если у системы восьмибитный байт, то char тоже обязан быть восьмибитным.

Здесь ещё один прикол есть. В Си не существует типа данных, меньшего char! Даже массив "байт" нельзя создать в системе с 16-бит char. Поэтому есть в системе "байт" или нет его - знает только программист. У меня затык возник когда BIOS процедура, работающая с USB требует передать ей размер именно в байтах (по USB-стандарту), а sizeof() объектов, которые я хочу передать, мне возвращаются в У.Е. И соответствие между USB-bytes и У.Е. мне необходимо вычислить.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 21 2009, 05:00
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Ну, тогда вполне подходит способ, предложенный Real'ом: в limits.h для C5500 честно написано, что char имеет размер 16 бит.
Или объекты еще и упакованы по два восьмибитных байта в char?

P.S. На 55-м я честно забил на размер char'а, использовав для записи USB дескрипторов только половину, благо их немного. А вот с SD/MMC пришлось извращаться.
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 21 2009, 05:09
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(GetSmart @ Aug 21 2009, 08:54) *
И соответствие между USB-bytes и У.Е. мне необходимо вычислить.

На сколько я помню, в USB далеко не все дескрипторы имеют четную длину. Так что вроде как не судьба автоматом-то считать.

Цитата(aaarrr @ Aug 21 2009, 08:05) *
По стандарту C99 - в байтах:


И по тому же стандарту - байт:

Цитата
1 byte
addressable unit of data storage large enough to hold any member of the basic character
set of the execution environment
2 NOTE 1 It is possible to express the address of each individual byte of an object uniquely.


так что все в норме, никто не говорил, что он 8 бит.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 05:27
Сообщение #13


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(SM @ Aug 21 2009, 11:09) *
так что все в норме, никто не говорил, что он 8 бит.

smile.gif
Компиляторописатели... Получается, что "программный" байт и "железный" байт не одно и то же. А если программист читает User Manual, то он реально запутается, т.к. в мануале байт - это честные 8 бит.

Цитата(aaarrr @ Aug 21 2009, 11:00) *
... использовав для записи USB дескрипторов только половину, благо их немного.

А вот это я вообще не понял. Чего немного?

Сообщение отредактировал GetSmart - Aug 21 2009, 05:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 21 2009, 05:43
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SM @ Aug 21 2009, 09:09) *
так что все в норме, никто не говорил, что он 8 бит.

Да. "Вариантов нормы" только много получается smile.gif

Цитата(GetSmart @ Aug 21 2009, 09:27) *
А вот это я вообще не понял. Чего немного?

Дескрипторов немного, поэтому не жалко использовать половинку от char'а на каждый байт.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 06:04
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aaarrr @ Aug 21 2009, 11:43) *
Дескрипторов немного, поэтому не жалко использовать половинку от char'а на каждый байт.

До сих пор не понял.
Код
USB_postTransaction(&EP2_OUT, size, buf, USB_IOFLAG_NOSHORT);

тут size передаётся в "железных" USB-байтах, а buf - указатель на буфер, из которого будет извлечено 100% бит, то есть если это char[10], то оттуда передастся 20 "железных" USB-байт.

Сообщение отредактировал GetSmart - Aug 21 2009, 06:11


--------------------
Заблуждаться - Ваше законное право :-)
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 - 15:02
Рейтинг@Mail.ru


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