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

 
 
> Как стандартно в Си узнать размер 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
 
Start new topic
Ответов
ReAl
сообщение Aug 20 2009, 20:33
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


.
******

Группа: Участник
Сообщений: 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
dxp
сообщение Aug 21 2009, 04:13
Сообщение #5


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
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
dxp
сообщение Aug 21 2009, 12:33
Сообщение #7


Adept
******

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



Цитата(SM @ Aug 21 2009, 11:22) *
На этом TMS-е есть адресации "low_byte(addr)" и "high_byte(addr)" для команд load/store. Так что байт там как у всех.

А по скорости/накладным они такие же, как и для словной адресации? Или это некое расширение, реализуемое за счет эмуляции (типа, слово считывается целиком, в АЛУ модифицируется нужный байт и потом складываются в память)?

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

Да, насчет sizeof(char) был неправ (давно было, забывать начал smile.gif ). В плюсах тоже так же: sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;


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


Гуру
******

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



Цитата(dxp @ Aug 21 2009, 16:33) *
А по скорости/накладным они такие же, как и для словной адресации? Или это некое расширение, реализуемое за счет эмуляции (типа, слово считывается целиком, в АЛУ модифицируется нужный байт и потом складываются в память)?

Да, по скорости и накладным тоже самое, но только в том случае, если заранее известно, какой байт нужен - low или high. К АЛУ это отношения не имеет, так как при обращениях оно управляет сигналами "byte enable (BE[1:0])" шины, или DQM-ами, если это SDRAM. Но адрес-то при этом все равно словесный, а выбор байта осуществляется при помощи указания конкретной команды ассемблера. Т.е. если организовывать полностью произвольный доступ к любому байту - то нужно иметь словесный адрес, бит выбора байта и условное выполнение той или другой команды. Плюс ко всему, если слово памяти может быть аргументом любой арифметики и можно сказать любой операции вообще, то байт из памяти только или load, или store.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 21 2009, 16:46
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SM @ Aug 21 2009, 15:49) *
Т.е. если организовывать полностью произвольный доступ к любому байту - то нужно иметь словесный адрес, бит выбора байта и условное выполнение той или другой команды. Плюс ко всему, если слово памяти может быть аргументом любой арифметики и можно сказать любой операции вообще, то байт из памяти только или load, или store.

Очередное дерьмецо от TI... Годное только для обработки звука.
Непонятно только зачем там USB.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 16:52
Сообщение #10


.
******

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



Цитата(defunct @ Aug 21 2009, 22:46) *
В общем очередное дерьмецо от TI... Годное только для обработки звука.

Щас SM Вас порвёт biggrin.gif

На самом деле, раз адресация в проце на 90% только пословная, то TI сделали правильно. Там только DMA имеет байтовый адрес.

Асмописатели на TMS наверное очень довольны такой архитектурой, в отличие от сишников. SM как раз один из них.

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


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


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(GetSmart @ Aug 21 2009, 19:52) *
Щас SM Вас порвёт biggrin.gif

Ну от этого Вам будет не легче передать фрейм нечетной длины. :P

А TI изделия (без учета приобретений на стороне - BB, Luminary и т.п.) всегда считал и продолжаю считать неадекватными, за редким исключением.
Почти каждый их DSP / MK - это "шедевр" smile.gif полученный в результате больной фантазии индусов.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 18:25
Сообщение #12


.
******

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



Цитата(defunct @ Aug 21 2009, 23:01) *
Ну от этого Вам будет не легче передать фрейм нечетной длины. :P

Проблема не в невозможности, а в неудобстве/некрасивости сишной реализации.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- GetSmart   Как стандартно в Си узнать размер char-а   Aug 20 2009, 17:24
- - Axel   Я бы сделал так: #ifdef TMS320 #define SIZE_OF_CH...   Aug 20 2009, 19:40
|- - aaarrr   Цитата(GetSmart @ Aug 21 2009, 07:59) Мне...   Aug 21 2009, 04:05
||- - SM   Цитата(defunct @ Aug 21 2009, 21:01) Ну о...   Aug 21 2009, 17:32
|- - aaarrr   Цитата(dxp @ Aug 21 2009, 08:13) А char м...   Aug 21 2009, 04:39
||- - GetSmart   Цитата(aaarrr @ Aug 21 2009, 10:39) Тогда...   Aug 21 2009, 04:54
||- - SM   Цитата(GetSmart @ Aug 21 2009, 08:54) И с...   Aug 21 2009, 05:09
||- - GetSmart   Цитата(SM @ Aug 21 2009, 11:09) так что в...   Aug 21 2009, 05:27
|- - Andron_   Цитата(dxp @ Aug 21 2009, 11:13) Наскольк...   Sep 9 2009, 15:52
- - aaarrr   Ну, тогда вполне подходит способ, предложенный Rea...   Aug 21 2009, 05:00
- - aaarrr   Цитата(SM @ Aug 21 2009, 09:09) так что в...   Aug 21 2009, 05:43
|- - GetSmart   Цитата(aaarrr @ Aug 21 2009, 11:43) Дескр...   Aug 21 2009, 06:04
|- - aaarrr   Цитата(GetSmart @ Aug 21 2009, 10:04) До ...   Aug 21 2009, 07:09
|- - ReAl   Цитата(GetSmart @ Aug 21 2009, 09:04) тут...   Aug 21 2009, 10:23
|- - aaarrr   Цитата(ReAl @ Aug 21 2009, 14:23) А Вы го...   Aug 21 2009, 10:29
|- - GetSmart   Цитата(ReAl @ Aug 21 2009, 16:23) А Вы го...   Aug 21 2009, 10:31
- - aaarrr   Ну а в C99 написано: Цитата3.6 1 byte addressable ...   Sep 9 2009, 15:57


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

 


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


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