Есть строка содержащая четыре символа 'FFCE' - это число отрицательное -50 какой функцией мне преобразовать строку в int чтобы учлась эта отрицательность
strtol(buf, &end_ptr, 16); sscanf_s(buf,"%x",&result); - не учитывают ,у них получается FFCE = 65486
с int16_t у меня заработало. Дать полный код? А int плишком платформозависимый, в avr должно работать, а в более мощных системах int часто равен int32_t или даже больше.
с int16_t у меня заработало. Дать полный код? А int плишком платформозависимый, в avr должно работать, а в более мощных системах int часто равен int32_t или даже больше.
Так то это Microsoft Visual Studio компилятор а прога читает .eep прошивку, которую сотворил CodeVision (intel hex file)
и вот те два байта Int и надо превратить в отрицательное число
При чем здесь 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 19:35:53
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4589 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
ESWANT писал(а):
Есть строка содержащая четыре символа 'FFCE' - это число отрицательное -50
Это - не отрицательное число. Отрицательна переменная или нет, знает только компилятор. Для машины, это - обычные данные. Это такой же глупый вопрос, как и, много раз здесь звучащий : "Как перевести число из десятичной системы в шеснадцатиричную ?", на который ответ один - никак, это, всего-лишь, представление одного и того же числа, только в разных системах.
Собственно, это продемонстрировано и в моей программе. 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
Ну, о чём я и говорю... FFCE - это и -50, и 65486, и 0xFFCE, и 0b1111111111001110, ... Машине пофиг чё это, и как себе это представляет человек, у неё есть только данные, где то там хранящиеся, и всё. По этому, вопрос "как из FFCE сделать -50 ?" - глупый. Это - одно и тоже.
Не одно и то же. FFCE равно -50 только для знакового 16-битного числа. Для чисел с меньшей разрядностью такое выражение просто не имеет смысла, для всех остальных это 65486.
Заголовок сообщения: Re: детский ? по отрицательным числам указанным шестнадцатер
Добавлено: Пт ноя 28, 2014 20:50:01
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4589 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
COKPOWEHEU, Вы сейчас прикалываетесь, или решили меня потроллить ? Вот лежат, где-то там в ОЗУ данные - FFCE. Контроллеру по-барабану, как Вы себе их представляете. Как -50 (для знаковой int), как 65486 (для остальных типов), ... Пофигу ему, для него это, всего-лишь, битики. "Понимает" только компилятор, которому Вы указываете, как обращаться с этими данными. Если я их положил в int_16, то это будет -50. Причём будете об этом знать только Вы и компиялятор. Это я и имею ввиду - тоже самое. А Вы мне пытаетесь доказать обратное. Ну или просто поговорить Вам хочется Причём, прекрасно понимая, что я имею в виду
Наверное, не сошлись в вопросах терминологии. Самому контроллеру - железу - конечно, пофиг, что именно считать, он не знает об 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
Visual Studio здесь при том, что там надо указывать __int16 а не int16_t и файл *.eep прошивки eeprom моя программа всё таки открывает ( как текстовый файл
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения