Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюк IAR или мой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
VladimirYU
В IAR AVR 4.12 столкнулся вот с чем:

// имею
int data = 0xabd6;

// хочу увеличить разрядность до 32 без знака
unsigned int tmp = (unsigned int) data;

// получаю tmp = 0x0000abd6, что и хотел

а теперь вместо 32 захотел увеличить разрядность до 64 без знака из исходного data
unsigned long long tmp = (unsigned int) data;

// получаю tmp = 0x6dba000000000000

?????????????
Freeze Anti
а long два раза стоит это опечатка или зачем?

а если отдать на усмотрение компилятора приведение типов, то есть записать

unsigned long tmp = data

что получается?
MrYuran
Цитата
unsigned long long tmp = (unsigned int) data;

Ну и чему вы удивляетесь?
int упорядочен по 2 байта, вот и получите!

Если уж приводить к типу, то хотя бы к такому же, то есть unsigned long long tmp =(unsigned long long)data
Непомнящий Евгений
Цитата(Freeze Anti @ May 7 2008, 16:13) *
а long два раза стоит это опечатка или зачем?


long long - это тип такой. Целое 64 разряда.
prottoss
У меня получилось как положено = 0x000000000000ABD6

IAR C/C++ Compiler for ARM
4.42A Evaluation (4.42.1.201)
Сергей Борщ
Цитата(MrYuran @ May 7 2008, 15:18) *
Ну и чему вы удивляетесь?
int упорядочен по 2 байта, вот и получите!
Неверно. Тут не работа с указателями и числами в памяти.
Цитата(MrYuran @ May 7 2008, 15:18) *
Если уж приводить к типу, то хотя бы к такому же, то есть unsigned long long tmp =(unsigned long long)data
Снова неверно. Исходное число было знаковым, поэтому при таком преобразовании знак будет расширен в старшие байты. В вашем варианте приведение вообще не нужно - оно будет сделано автоматически.
VladimirYU
Цитата(MrYuran @ May 7 2008, 16:18) *
Ну и чему вы удивляетесь?
int упорядочен по 2 байта, вот и получите!

Если уж приводить к типу, то хотя бы к такому же, то есть unsigned long long tmp =(unsigned long long)data


Пробовал, не помогает, да это и не принципиально ИМХО. А выделенную фразу поясните, если нетрудно. Версия 4.12 для AVR.
MrYuran
Цитата(prottoss @ May 7 2008, 16:01) *
У меня получилось как положено = 0x000000000000ABD6

IAR C/C++ Compiler for ARM
4.42A Evaluation (4.42.1.201)

Повезло.
АРМ существо 32-разрядное, там вероятность "перекоса" 64р слов меньше, чем в 8-битном АВР, всего лишь 50х50

стоп...
Цитата
получаю tmp = 0x6dba000000000000

чё, на самом деле задом наперёд?
я чё-то не посмотрел сначала..
Тогда непонятно вообще
prottoss
Проверил для AVR - опять правильный результат = 0x000000000000ABD6

IAR C/C++ Compiler for AVR
4.30A/W32 [Evaluation] (4.30.1.3)
VladimirYU
Нажмите для просмотра прикрепленного файла
Цитата(prottoss @ May 7 2008, 17:39) *
Проверил для AVR - опять правильный результат = 0x000000000000ABD6

IAR C/C++ Compiler for AVR
4.30A/W32 [Evaluation] (4.30.1.3)


Прикрепляю простой тестовый примерчик.
MrYuran
Цитата(VladimirYU @ May 8 2008, 10:37) *
Нажмите для просмотра прикрепленного файла

Прикрепляю простой тестовый примерчик.

Дык, ёлы-палы, отображение просто задом наперёд, а не данные

ps: а просто картинку нельзя было приклеить?
VladimirYU
Цитата(MrYuran @ May 8 2008, 11:49) *
Дык, ёлы-палы, отображение просто задом наперёд, а не данные


Ok! Это видимо IARовцы так с 1 апреля поздравляют
VladimirYU
Цитата(VladimirYU @ May 8 2008, 12:00) *
Ok! Это видимо IARовцы так с 1 апреля поздравляют

Посмотрел, в версии 5.10 эту прелесть убрали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.