Че-то я туплю, ребят.

GMX

schizophrenic
#1
Короче, имеем int16_t (переменная data), задача простая: разбить его на два байта, передать, а на приемнике обратно собрать.
Делаю раз:
highByte=(char)(data>>8);
lowByte=(char)(data);

И вот тут появляется интересная херня. При data равном, например, 0x00FD ну или еще каком-нить значении, где старший байт нулевой, результатом операции (char)(data>>8) имею 0xFF. Шо это блин за нах?
 

GMX

schizophrenic
#3
Да, но я пробовал и
highByte=(char)(data>>8 & 0xFF);
lowByte=(char)(data & 0xFF);

И результат - та же фигня...

Ну и вопрос: с чего это так и должно быть?
Вот имеем мы 0000000011111111, смещаем на восемь вправо, получаем 0000000000000000.
Откуда там единицам взяться?
 
Последнее редактирование:

Aliens

Меня знают многие ;-)
#6
int _tmain(int argc, _TCHAR* argv[])
{
short int data;
data=0x00fd;
char highByte=(char)(data>>8);
char lowByte=(char)(data);

return 0;
}

результат
highByte 0x00 '\0' char
lowByte 0xfd 'э' char

код нормально работает.
 

GMX

schizophrenic
#7
int _tmain(int argc, _TCHAR* argv[])
{
short int data;
data=0x00fd;
char highByte=(char)(data>>8);
char lowByte=(char)(data);

return 0;
}

результат
highByte 0x00 '\0' char
lowByte 0xfd 'э' char

код нормально работает.
Я как бэээ и сам понимаю, что он ДОЛЖЕН нормально работать. Но почему-то с моем случае не работает. Оптимизацию компилятора вообще уже отключил нах. Но результат описан в первом посте. Правда мой компилятор уж очень любит перменные по регистрам запихивать... Может с этим связано...
 

GMX

schizophrenic
#9
ну это не в коде дело, а ты на чем пишешь ?
Сиська, компилятор - МSPGCC. В дебаггере гляжу: в функцию data передается верно, действительно ее запихивает в регистр... А вот при попытке что-то с ней сделать получается какая-то фигня.
Даже если в функции я делаю:
int16_t my_data;
my_data=data;
То при data=0x00ХХ получаем my_data равное 0xFFХХ. Я уже худею с этого.
 

Aliens

Меня знают многие ;-)
#10
Ну понятно, там флаг стоит, который решает каким битом заполнять при сдвиге в право. И он стоит у тебя в 1
Под какой проц пишешь? Смотри на него мануалы и смотри управляющий регистр.
 

GMX

schizophrenic
#11
Так какая разница-то? Я же все равно правую часть забираю! Лажа какая-то.
 

GMX

schizophrenic
#12
Все, вроде раскопал. Переменные, передаваемые в функцию в качестве параметров объявлены как static. И хотя функция находится в том же модуле, но внутри нее начинают происходить чудеса. Объявил глобально.