Получить int из char

DrumAsm
Дата: 14.01.2015 12:16:24
Здравствуйте. Пишу программу в Visual Studio 2008. Проект Win32.
Подскажите, имеется

unsigned char p[] = {0x20, 0x00, 0xA3, 0x45, 0x89, 0x41 };


Как получить
short int i
из значений
p[1]
и
p[2]
. В данном случае i должно быть равно 163. Я сделал так:

i=p[2]*256+p[1];


Мне кажется, что это примитивно. Может есть другие варианты? Потому что long long int таким методом не удобно получать. Цикл наверное тоже не красиво будет смотреться. Спасибо.
Dimitry Sibiryakov
Дата: 14.01.2015 12:37:08

DrumAsm
Мне кажется, что это примитивно

Ну замени умножение на сдвиг для "продвинутости".

Это решение, в отличии от каста, не зависит от процессора.

Posted via ActualForum NNTP Server 1.5

Dima T
Дата: 14.01.2015 13:06:38
DrumAsm
В данном случае i должно быть равно 163. Я сделал так: i=p[2]*256+p[1];

Так у тебя будет 0xA300
163 будет так p[1]*256+p[2]

Если все-таки правильно считать так как ты написал, то можно так
unsigned short i = *((unsigned short*)&p[1]);

Если правильно как я написал, то *256 но делать это в цикле
int res = 0;
for(int i = 1; i <= 2; i++) {
   res *= 256;
   res += p[i];
}
DrumAsm
Дата: 14.01.2015 13:23:28
Dima T,

Точно! 0xA300. Sorry. Это я уже запарился.. А в первом случае просто переносится указатель?
Dima T
Дата: 14.01.2015 13:33:17
DrumAsm
Dima T,

Точно! 0xA300. Sorry. Это я уже запарился.. А в первом случае просто переносится указатель?

Нет, читается значение, но читается как тип unsigned short. А т.к. unsigned short это два байта, то кроме p[1] берется p[2].
ХЗ как еще объяснить.
если пошагово расписать то вот что происходит:
unsigned char* pp = &p[1];
unsigned short* pi = (unsigned short*) pp;
unsigned short i = *pi;
RWolf
Дата: 14.01.2015 13:41:54
Это решение чувствительно к архитектуре процессора — на одних архитектурах результат будет 0xA300, на других 0x00A3, на третьих результат не определён, на четвёртых программа упадёт. Лучше уж сдвигами.
DrumAsm
Дата: 14.01.2015 13:42:45
Dima T,

А вот всегда интересовал такой вопрос. Можно указателю unsigned short i присвоить адрес p[1], чтобы из указателя i я мог получить p[1] и p[2]?
mayton
Дата: 14.01.2015 13:59:50
DrumAsm, в том то и весь цимес брат. Можно. Это похоже на езду без ремней безопасности.
Быстро и опасно. Но можно. На сях. В отличие от этих ваших шарпов и джав.
Dima T
Дата: 14.01.2015 14:04:08
DrumAsm
Dima T,

А вот всегда интересовал такой вопрос. Можно указателю unsigned short i присвоить адрес p[1], чтобы из указателя i я мог получить p[1] и p[2]?

брр ... ты сам понял что написал? Сделать из указателя char указатель short чтобы потом из него извлекать char. Можно, но зачем?
Dima T
Дата: 14.01.2015 14:27:57
RWolf
Это решение чувствительно к архитектуре процессора — на одних архитектурах результат будет 0xA300, на других 0x00A3, на третьих результат не определён, на четвёртых программа упадёт. Лучше уж сдвигами.

Вроде уже не осталось архитектур где будет 0x00A3 (т.н. big endian), а "результат не определён" вообще из области фантастики.

Недавно пробовал откомпилировать одну свою программулину с подобными конструкциями под ARM-процессор - запустилось, работало корректно, общалась по сетке с другой прогой под виндой. Возможно есть какая-то экзотическая электроника с big endian, но если ТС до нее доберется, то, думаю, проблема big endian будет не самой серьезной.