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

 
 
> Явное преобразование типов в IAR, Тупой вопрос
Still Enemy
сообщение Jul 6 2015, 05:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



У меня вопрос, связанный с противоположными взглядами на действительность IAR'a и моими: есть массив из 2 элементов{0x3f,0xff} типа uint8_t, при явном преобразовании (*uint16_t), у меня выходит, что конечный указатель указывает на ячейку памяти, значение которой 0xff3f. Как так то? Что за дичь то?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mempfis_
сообщение Jul 6 2015, 05:51
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Still Enemy @ Jul 6 2015, 08:23) *
У меня вопрос, связанный с противоположными взглядами на действительность IAR'a и моими: есть массив из 2 элементов{0x3f,0xff} типа uint8_t, при явном преобразовании (*uint16_t), у меня выходит, что конечный указатель указывает на ячейку памяти, значение которой 0xff3f. Как так то? Что за дичь то?


Длинные переменные в памяти хранятся от младшего байта к старшему в порядке возрастания адреса. Например int var = 0x0000ff3f будет хранится в памяти условно в виде массива buf[] = {0x3f, 0xff, 0x00, 0x00};
Соответственно
*((unsigned short*) (buff+0)) == 0xff3f
*((unsigned short*) (buff+1)) == 0x00ff
*((unsigned short*) (buff+2)) == 0x0000

IAR в зависимости от типа указателя возмёт требуемое кол-во байт данных и соберёт их переменную используя для младшего байта данные по младшему адресу, для старшего - по старшему.
Это всё прекрасно видно при отладке в IAR если посмотреть на то, как переменная располагается в памяти и модифицируется при манипуляциях с нею.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 6 2015, 07:12
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Still Enemy @ Jul 6 2015, 08:23) *
Что за дичь то?


Вот тут написано чуть подробнее: википедия. С одним, правда, исключением - ядро ARM в теории поддерживает оба порядка байт, но на практике (в кремнии) реализуют только little endian.


Цитата(mempfis_ @ Jul 6 2015, 08:51) *
*((unsigned short*) (buff+0)) == 0xff3f
*((unsigned short*) (buff+1)) == 0x00ff
*((unsigned short*) (buff+2)) == 0x0000

А вот это, в общем случае, плохо. Не каждый процессор умеет читать переменные длиной 2 байта с нечётного адреса. ARM7, например, от такого кода сломается.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 6 2015, 08:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(esaulenka @ Jul 6 2015, 10:12) *
ядро ARM в теории поддерживает оба порядка байт, но на практике (в кремнии) реализуют только little endian.

насколько помню, CM3 от NXP укладывал как little endian, а когда начал разбираться с STM32F0 - он укладывает как big endian (во всяком случае, вектора выглядели именно так, если смотреть дамп)

чуть попозже еще раз проверю
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 11:13
Рейтинг@Mail.ru


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