Технический форум по робототехнике.
Korbofos » 15 дек 2011, 19:36
signed char, unsigned char, char - три разных типа?
dccharacter » 15 дек 2011, 20:11
два
Добавлено спустя 34 секунды:
(Вероятно, зависит от компилятора. В Hi Tech C) char = unsigned char
Duhas » 15 дек 2011, 20:20
Си мутная хрень, что ппц, как char может быть signed? signed|unsigned byte я бы еще понял..
все, не лезу больше )
dccharacter » 15 дек 2011, 20:22
Duhas писал(а):Си мутная хрень, что ппц, как char может быть signed? signed|unsigned byte я бы еще понял..
все, не лезу больше )
от -127 до 128
А, понял твой вопрос. Ну в курсах специально объясняют, что тип char не имеет отношения к character, как бы этого не хотелось

а byte - это ни что иное, чем
#define byte (unsigned char)
Последний раз редактировалось
dccharacter 15 дек 2011, 20:26, всего редактировалось 1 раз.
Duhas » 15 дек 2011, 20:26
область определения понятна, но терминология знаковый/беззнаковый символ - мягко говоря коробит..
Korbofos » 15 дек 2011, 21:16
- Код: Выделить всё • Развернуть
char i2c_read_byte(void)
Не могу понять где косяк с компасом? Функция в примере возвращает значение со знаком. Пробовал со знаком без знака. Одна и та же ерунда выходит. Даташит на английском только расстраивает
Добавлено спустя 1 минуту 26 секунд:Или где-то косяк с приведением типов?
boez » 15 дек 2011, 23:28
Пока ты эти байтовые значения не начинаешь расширять - тебе вообще насрать signed или unsigned. Потому что в процессоре к примеру 0хС0 - это просто 11000000. И все. Называется переменная signed - компилятор думает, что это -64. Называется unsigned - думает что 192. А реально это 11000000, оно как пришло в таком виде из i2c, так именно в таком же виде 11000000 уедет в uart. И вот только на той стороне, в компе, когда ты его начнешь расширять до int - оно превратится в -64 или 192, в зависимости от того как был обозван исходный байт.
И вот там, кстати, тебя поджидает хитрая засада. Твой код:
- Код: Выделить всё • Развернуть
int ax = (int)(axh << 8) + axl;
равносилен
- Код: Выделить всё • Развернуть
int ax = axl;
Рассказать почему или уже догадался?
Добавлено спустя 3 минуты 57 секунд:Ты кстати зря сразу это все в тригонометрию свою заталкиваешь. Выведи сначала 12 отдельных байт. Посмотри как меняются когда вертишь железяку. Объедини в 6 слов. На них посмотри. Посмотри, плавно ли меняются когда плавно вращаешь. Корректно ли через ноль переходят? И вот уже потом делай тригонометрию. Да, кстати, если у тебя там знаковое 16-битное - тебе его надо не в int, а в short превращать, когда байты сливаешь.
Korbofos » 15 дек 2011, 23:37
int ax = read_rx();
char axl = read_rx();
int ax =axl;
Как-то так? походу не вкурил
Добавлено спустя 2 минуты 34 секунды:
Значения вроде плавно меняются, завтра ещё раз проверю!
boez » 15 дек 2011, 23:51
Тебе надо что? Тебе надо 2 8-битных числа слить в одно 16-битное. Тут главное помнить, что знак - он всегда живет в старшем байте, если он вообще есть. Младшие - всегда беззнаковые. Вот так сливаются 8+8 в 16, причем не важно - знаковое или нет, разница только в типе ax:
- Код: Выделить всё • Развернуть
unsigned char axl, axh;
short ax;
ax = (((unsigned short)axh)<<8)+axl
И для себя разберись, почему
- Код: Выделить всё • Развернуть
ax = (((unsigned short)axh)<<8)+axl
работает, а
- Код: Выделить всё • Развернуть
ax = (unsigned short)(axh<<8)+axl
нет.
Korbofos » 16 дек 2011, 00:11
Спасибо boez. Так совсем другое дело. Цифры "ближе к телу пошли(похожие на данные калибровки в примере)".
Korbofos » 16 дек 2011, 09:10
Компас работает нормально, а вот с акселерометром походу косяк.
cjA » 17 дек 2011, 03:33
signed char два байта займет в памяти потому что Си не умеет побитово память распределять
(почитал каменты- ребята, какже грустно за вас, не умеющих писать на asm, там таких проблемм нету, каждый бит в любом углу процессора тебе доступен подчинен (красиво сложил песню, пожалуй DeaD её подарю))
boez » 17 дек 2011, 10:32
cjA, ты не прав. signed и unsigned char занимают совершенно одинаковое место - ровно один байт, т.е. 8 бит.
elmot » 17 дек 2011, 10:35
Си умеет распределять память побитово.
http://en.wikipedia.org/wiki/Bit_field
=DeaD= » 17 дек 2011, 10:37
cjA писал(а):signed char два байта займет в памяти потому что Си не умеет побитово память распределять
И эти люди рассказывают нам про то, чем хорош asm
