Например TDA7294

Форум РадиоКот • Просмотр темы - детский ? по отрицательным числам указанным шестнадцатерично
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб ноя 08, 2025 03:23:23

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: детский ? по отрицательным числам указанным шестнадцатерично
СообщениеДобавлено: Пт ноя 28, 2014 12:45:01 
Встал на лапы

Зарегистрирован: Пн дек 06, 2010 12:26:45
Сообщений: 98
Рейтинг сообщения: 0
Укажите путь истинный......

Есть строка содержащая четыре символа 'FFCE' - это число отрицательное -50
какой функцией мне преобразовать строку в int чтобы учлась эта отрицательность

strtol(buf, &end_ptr, 16);
sscanf_s(buf,"%x",&result); - не учитывают ,у них получается FFCE = 65486

или в старшем бите самому копаться?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 13:15:42 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
сделать result типа int или, лучше, int16_t.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 13:19:53 
Встал на лапы

Зарегистрирован: Пн дек 06, 2010 12:26:45
Сообщений: 98
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
сделать result типа int или, лучше, int16_t.

а result и есть int


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 13:23:21 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
с int16_t у меня заработало. Дать полный код? А int плишком платформозависимый, в avr должно работать, а в более мощных системах int часто равен int32_t или даже больше.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 13:59:32 
Встал на лапы

Зарегистрирован: Пн дек 06, 2010 12:26:45
Сообщений: 98
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
с int16_t у меня заработало. Дать полный код? А int плишком платформозависимый, в avr должно работать, а в более мощных системах int часто равен int32_t или даже больше.


Так то это Microsoft Visual Studio компилятор
а прога читает .eep прошивку, которую сотворил CodeVision (intel hex file)

и вот те два байта Int и надо превратить в отрицательное число


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 14:33:25 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
При чем здесь microsoft visual studio? Я проверял на обчном gcc, а к вашим вижуалкам близко не подхожу. Как и к cvavr.
Цитата:
а прога читает .eep прошивку, которую сотворил CodeVision (intel hex file)
Прога выполняет .hex-файл, а не прошивку EEPROM'а.
Цитата:
и вот те два байта Int и надо превратить в отрицательное число
Двухбайтный знаковый int интерпретируется как знаковый. Другое дело, что обычный int может не быть двухбайтным, почему и советую попробовать наконец явно задать размер.
Код:
#include <stdio.h>
#include <inttypes.h>

int main(){
 int res;
 char str[]="FFCE";
 int16_t res16;

 sscanf(str,"%X",&res); //повторение ошибки - считывание 32-разрядного знакового числа
 printf("%i\n",res);
 sscanf(str,"%X",&res16); //решение проблемы - считывание 16-разрядного. Осторожно, sscanf хочет ссылку именно на 32-разрядное, поэтому пытался затереть соседнюю переменную.
 printf("%i\n",res16);
 res16=res; //другое решение проблемы - прямое присвоение. Можно еще поизвращаться через указатели.
 printf("%i\n",res16);
 return 0;
}

Вот что происходит при компиляции и выполнении
~$ gcc -o res main.c && ./res
65486
-50
-50


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 14:35:11 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
вывод printf("%i\n",(int16_t)res); тоже дает правильный знаковый результат.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 19:35:53 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4589
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
ESWANT писал(а):
Есть строка содержащая четыре символа 'FFCE' - это число отрицательное -50
Это - не отрицательное число. Отрицательна переменная или нет, знает только компилятор. Для машины, это - обычные данные.
Это такой же глупый вопрос, как и, много раз здесь звучащий : "Как перевести число из десятичной системы в шеснадцатиричную ?", на который ответ один - никак, это, всего-лишь, представление одного и того же числа, только в разных системах.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 19:41:07 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Собственно, это продемонстрировано и в моей программе. FFCE - шестнадцатеричное число. Для int16_t это -50, для uint16_t это 65486, для int32_t тоже 65486, так как переводится в 0x0000FFCE, то есть до старшего бита просто не достает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 19:52:46 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4589
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ну, о чём я и говорю...
FFCE - это и -50, и 65486, и 0xFFCE, и 0b1111111111001110, ...
Машине пофиг чё это, и как себе это представляет человек, у неё есть только данные, где то там хранящиеся, и всё.
По этому, вопрос "как из FFCE сделать -50 ?" - глупый. Это - одно и тоже.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 20:31:52 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Не одно и то же. FFCE равно -50 только для знакового 16-битного числа. Для чисел с меньшей разрядностью такое выражение просто не имеет смысла, для всех остальных это 65486.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 20:50:01 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4589
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
COKPOWEHEU, Вы сейчас прикалываетесь, или решили меня потроллить ? :)
Вот лежат, где-то там в ОЗУ данные - FFCE. Контроллеру по-барабану, как Вы себе их представляете. Как -50 (для знаковой int), как 65486 (для остальных типов), ... Пофигу ему, для него это, всего-лишь, битики. "Понимает" только компилятор, которому Вы указываете, как обращаться с этими данными.
Если я их положил в int_16, то это будет -50. Причём будете об этом знать только Вы и компиялятор. Это я и имею ввиду - тоже самое.
А Вы мне пытаетесь доказать обратное. Ну или просто поговорить Вам хочется :) Причём, прекрасно понимая, что я имею в виду :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 21:28:21 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Наверное, не сошлись в вопросах терминологии. Самому контроллеру - железу - конечно, пофиг, что именно считать, он не знает об int / int16_t / char, для него есть регистры и команды процессора.
Но когда мы говорим о записи числа - надо понимать, как она будет интерпретирована в конечном итоге. То есть Допустим, в ОЗУ по адресам начиная с 0x0100 расположено 2 байта 0xFFCE (может, ошибся и младший идет сначала - не в этом суть). Если компилятору говорят, что это int16, он будет обрабатывать число как -50, в остальных случаях - как 65486. Эти интерпретации не эквивалентны.
Код:
 int16_t x1;
 int32_t x2,y1=100,y2=100;

 x1=0xFFCE;
 x2=0xFFCE;

 y1-=x1;
 y2-=x2;
В переменных x1 и x2, y1 и y2 изначально находятся попарно одинаковые значения - FFCE и 100, но интерпретируются они по-разному. В результате работы программы
x1 = -50
x2 = 65486
y1 = 150
y2 = -65386


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Пт ноя 28, 2014 21:42:28 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4589
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Мы говорим об одном и том же :)
Ладно, завяжем с этой полемикой. Плюсик Вам в карму за приятное общение :beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Вс ноя 30, 2014 06:55:11 
Встал на лапы

Зарегистрирован: Пн дек 06, 2010 12:26:45
Сообщений: 98
Рейтинг сообщения: 0
Позвольте , я на правах топикстартера закончу

Visual Studio здесь при том, что там надо указывать __int16 а не int16_t
и файл *.eep прошивки eeprom моя программа всё таки открывает ( как текстовый файл :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
СообщениеДобавлено: Вс ноя 30, 2014 12:28:29 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Это уже особенности реализации. Надеюсь, механизм работы со знаковыми числами Вам понятен, как и причина багов, и что программа заработала как надо.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y