Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как извлечь short из int'a в С для BF
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Grumbler_2002
Надо сдвинуть 32-битный регистр и использовать потом старшее и младшее слова этого регистра. Ума не приложу, как сделать это из Си.
zltigo
Ума не приложу о чем это sad.gif?
Начните со сдвигов - постой? циклический?
Дальше - сдвинули что-то как-то куда-то как-то. Что после этого мешает продолжать "использовать" что-то.

short hi = reg>>16;
short lo = (short)reg;

Или мы о чем?
Grumbler_2002
Эквивалент
R0<<=1;
R1=Op(R0.h);
R2=Op(R0.l);
zltigo
Цитата(Grumbler_2002 @ Apr 26 2007, 22:12) *
Эквивалент
R0<<=1;
R1=Op(R0.h);
R2=Op(R0.l);


reg <<= 1;
short hi = reg>>16;
short lo = (short)reg;
Grumbler_2002
И че, компилятор рюхнет, что сдвигать reg не надо, а надо взять его старшую часть?
zltigo
Цитата(Grumbler_2002 @ Apr 26 2007, 22:18) *
И че, компилятор рюхнет, что сдвигать reg не надо, а надо взять его старшую часть?

Это уже от компилятора зависит. Приличные обычно разбираются. В стандартном "C" других путей нет.
Serg76
Цитата(Grumbler_2002 @ Apr 26 2007, 22:59) *
Надо сдвинуть 32-битный регистр и использовать потом старшее и младшее слова этого регистра. Ума не приложу, как сделать это из Си.

Это чё прикол такой новый ????? Если нет, то смотри далее

/********************************************************************
unsigned u_reg = 0x1111; // (например, двигаем регистр "0001000100010001" (bin)
unsigned short u_reg1=0x00,u_reg2=0x00;

// на сколько бит сдвигаем и куда?????????
// например, на 1 бит влево
u_reg <= 1; // "0010001000100010"
// старшее слово
u_reg1 = (unsigned short)((u_reg&0xff00)>>16); // "00100010"
// младшее слово
u_reg2 = (unsigned short)(u_reg&0xff); // "00100010"
*********************************************************************/
zltigo
Цитата(Serg76 @ Apr 26 2007, 22:36) *
Если нет, то смотри далее

&0xff00 и &0xff
1. Должны быть как минимум 0xffff0000 и 0x0000ffff дабы, как минимум просто не навредить;
2. Вообще не нужны ввиду полной нахренненужности.

Явная инициализация переменных нулями тоже совсем никчему.
Serg76
Цитата(zltigo @ Apr 26 2007, 23:45) *
&0xff00 и &0xff
1. Должны быть как минимум 0xffff0000 и 0x0000ffff дабы, как минимум просто не навредить;
2. Вообще не нужны ввиду полной нахренненужности.

Явная инициализация переменных нулями тоже совсем никчему.

по первому пункту согласен, тут я сам напорол косяков smile.gif , а что касается наложений масок и начальной инициализации, то это считается хорошим тоном, да и вообще лишний раз подстраховаться не помешает.


Цитата(zltigo @ Apr 26 2007, 23:45) *
&0xff00 и &0xff
1. Должны быть как минимум 0xffff0000 и 0x0000ffff дабы, как минимум просто не навредить;
2. Вообще не нужны ввиду полной нахренненужности.

Явная инициализация переменных нулями тоже совсем никчему.

по первому пункту согласен, тут я сам напорол косяков smile.gif - сыграл человеческий фактор, а что касается наложений масок и начальной инициализации, то это считается хорошим тоном, да и вообще лишний раз подстраховаться не помешает, а то бывали случаи, что сидишь в отладчике сутками, не можешь ошибку выявить, а оказывается где-то что-то не обнулил или еще что-то подобное.
zltigo
Цитата(Serg76 @ Apr 27 2007, 10:38) *
а что касается наложений масок и начальной инициализации, то это считается хорошим тоном

Хорошим тоном является не писать абсолютно лишнего и бесполезного кода, который кто-то будет читать и отвлекаться на поиски отсутствующего sad.gif смысла в оном. Ну и заодно "косяков" сами не напорете при его написании, превратив бесполезный во вредный.
Цитата
да и вообще лишний раз подстраховаться не помешает

От желания "подстраховаться" хорошо помогает изучение языка программирования а не чтение правил хорошего тона и чужих неведомо кем писанных исходников выложеных в интернет по причине их полной "бесценности" smile.gif.
Практически единственным средством (не то, что-бы подстраховки, а средством облегчения чтения), пожалуй, в "C" следует признать использование скобок для подчеркивания приоритетов.
Grumbler_2002
Нашел всё, что нужно было. Есть тип int2x16 и встроенные типы __built_in_lo/__built_in_hi.
Serg76
Цитата(zltigo @ Apr 27 2007, 12:15) *
Хорошим тоном является не писать абсолютно лишнего и бесполезного кода, который кто-то будет читать и отвлекаться на поиски отсутствующего sad.gif смысла в оном. Ну и заодно "косяков" сами не напорете при его написании, превратив бесполезный во вредный.

От желания "подстраховаться" хорошо помогает изучение языка программирования а не чтение правил хорошего тона и чужих неведомо кем писанных исходников выложеных в интернет по причине их полной "бесценности" smile.gif.
Практически единственным средством (не то, что-бы подстраховки, а средством облегчения чтения), пожалуй, в "C" следует признать использование скобок для подчеркивания приоритетов.

По всей видимости, Вы не сталкивались с данными ситуациями, а значит либо мало кодите, либо так все обходилось, ибо не бывает кода без ошибок. Дай Бог Вам счастья и в дальнейшем.
zltigo
Цитата(Serg76 @ Apr 27 2007, 22:23) *
По всей видимости, Вы не сталкивались с данными ситуациями, а значит либо мало кодите, либо так все обходилось...

На так, авось и вдруг не надеюсь. Я знаю что я делаю и какими средствами пользуюсь. Просто минимальный профессионализм.
Если Вы вдруг сталкивались - просветите насчет "инструмента" который вдруг позволил выдать разный
результат на:
Код
unsigned short u_reg1 = 0;
unsigned short u_reg2 = 0;
u_reg1 = (unsigned short)((u_reg&0xffff0000)>>16);
u_reg2 = (unsigned short)(u_reg&0xffff);

и
Код
unsigned short u_reg1;
unsigned short u_reg2;
u_reg1 = (unsigned short)(u_reg>>16);
u_reg2 = (unsigned short)u_reg;
Serg76
Цитата(zltigo @ Apr 28 2007, 00:25) *
На так, авось и вдруг не надеюсь. Я знаю что я делаю и какими средствами пользуюсь. Просто минимальный профессионализм.
Если Вы вдруг сталкивались - просветите насчет "инструмента" который вдруг позволил выдать разный
результат на:
Код
unsigned short u_reg1 = 0;
unsigned short u_reg2 = 0;
u_reg1 = (unsigned short)((u_reg&0xffff0000)>>16);
u_reg2 = (unsigned short)(u_reg&0xffff);

и
Код
unsigned short u_reg1;
unsigned short u_reg2;
u_reg1 = (unsigned short)(u_reg>>16);
u_reg2 = (unsigned short)u_reg;

В этом случае результаты будут, конечно же, идентичны, но у меня это уже дело привычки, и поверьте лучше все-таки переменные инициализировать, тогда и переживать не придёться.
zltigo
Цитата(Serg76 @ Apr 27 2007, 23:40) *
и поверьте лучше все-таки переменные инициализировать, тогда и переживать не придёться.

1. Инициализацию глобальных переменных я всегда указываю делать компилятору (кстати, не встречал компилятора, где это не было-бы опцией по умолчанию). Это ему делать много сподручнее и главное абсолютно надежно, в отличие от ручного прописывания каждой переменной. Не говоря уже о лишнем коде получающемся при этом.
2. Инициализация локальных делается по необходимости и я прослеживаю, дабы waning-и компилятора об использовании переменной до ее инициализации не были подавлены. Компиляторов без такого warnig я что-то уже давно не припомню.

И что характерно - никаких пустых переживаний smile.gif
dxp
Цитата(Serg76 @ Apr 28 2007, 03:40) *
В этом случае результаты будут, конечно же, идентичны, но у меня это уже дело привычки, и поверьте лучше все-таки переменные инициализировать, тогда и переживать не придёться.

В коде

unsigned short u_reg1;

переменная u_reg1, если она глобальная/статическая, будет проинициализирована нулем на этапе статической инициализации (до вызова main). Это по Стандарту. Т.ч. руками ничего инициализировать тут не надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.