LINUX.ORG.RU

Конкатенация двух чисел.

 , ,


0

1

Два разных элемента массива из шестнадцатеричных чисел составленные вместе представляют искомое число. Подскажите решение.

 char array[2] ;
 int x ;

 array[2] = 0x03 ;
 array[3] = 0xE7 ;

x = ?(Нужно х присвоить значение 3E7)



Последнее исправление: CYB3R (всего исправлений: 1)

м

a = 0x03 
b = 0xE7
x = (a << 8) | b;

ossa ★★
()
char array[2] ;
array[2] = 0x03 ;
array[3] = 0xE7 ;

Выход за пределы массива.

А вообще (если соединяемые числа в 0-м и 1-м элементах):

x = (int *)array;

prischeyadro ★★★☆☆
()
Ответ на: комментарий от prischeyadro

А вообще (если соединяемые числа в 0-м и 1-м элементах):

порядкобайтозависимо.

anonymous
()
Ответ на: комментарий от prischeyadro

«не будет ли это зависеть от порядка байт»?

ossa ★★
()

читал на первой странице

umren ★★★★★
()

Я тут вижу выход за пределы массива. Мне кажет в последнее время стало больше наркомании в Development. Народ уже Новый год начал праздновать?

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

стало больше наркомании в Development

Студенты хвосты сдают.

ossa ★★
()
Ответ на: комментарий от prischeyadro
x = (int *)array;

ошибка компиляции: присваивание int* в int
кроме того, тот мусор, что в следующих двух байтах после массива тоже попадет в 'x', если, конечно, размер int'а не два байта
ну и если все это починить, то будет работать только на big-endian

итого: facepalm.png

anonymous
()
Ответ на: комментарий от ossa

А ещё порядок байт. Но для лабороторки это не важно >_<

Stil ★★★★★
()
Ответ на: комментарий от anonymous

Да, спасибо, должно быть

x = *(int *)array;

Помню,однажды пришлось так делать потому что сдвиги не помогали — две половинки читались из восьмибитных регистров акселерометра, и представляли они собой куски знакового инта в форме дополнения до нуля. Если просто сдвигать и присваивать их знаковому инту, то -128..127 превращалось в 0..255. А если записать их в массив и кастануть, то работало прекрасно. Да, естественно, это было предназначено конкретно для big endian с шестнадцатибитным интом (это был AVR).

prischeyadro ★★★☆☆
()
Последнее исправление: prischeyadro (всего исправлений: 1)
Ответ на: комментарий от podovalov5

используй только вместо char array[...] uint8_t array[...] , а то получится как у prischeyadro =)

ossa ★★
()
Ответ на: комментарий от ossa

а ещё можно вот так:

unsigned a = 0x1, b = 0x2, c = 0x3, d = 0x4;
unsigned x = ((union { uint8_t in[4]; uint32_t out; }) { .in = { d,c,b,a } }).out;

если сильно повезет, то может собраться примерно так:

L__routine_start__Z2f2hhhh_1:
f2(unsigned char, unsigned char, unsigned char, unsigned char):
  movb %cl, -8(%rsp)
  movb %dl, -7(%rsp)
  movb %sil, -6(%rsp)
  movb %dil, -5(%rsp)
  movl -8(%rsp), %eax
  ret
anonymous
()

Точно выше говорят аркомания

Нужно х присвоить значение 3E7

0x03 == 0х0300, по какому-то негласному соглашению (ты у препода телепат) 0xE7 == 0x00E7. Так? Ну, если ты телепат, то придумай как дать ответ, который ждет препод.

int x

Обычно считают в байтах, битах. Т.к. это читабельно. Дальше делаешь человечно, хотя бы описываешь структуру и в комментах описываешь, почему одно число стоит первым, а второе последним (даже если это без разницы — тоже описываешь).

gh0stwizard ★★★★★
()
Ответ на: комментарий от anonymous

«Понятный код при необходимости нет проблемы оптимизировать. Проблемы возникают когда i=i++ + ++i»

Debasher ★★★★★
()
Ответ на: комментарий от anonymous

Так можно проверить чётность числа: x&1, не говнокод и быстрее (без оптимизации)

TheAnonymous ★★★★★
()
Ответ на: комментарий от anonymous

а что нужно дописать в коде или какие флаги gcc дать, чтоб результат был похожим?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.