Как обратиться к байтам переменной типа int?
1) Допустим у нас есть переменная типа int (или unsigned int), и она равна какому-то числу. Как можно переменной типа unsigned char приcвоить значение 2-ого, 3-его или 4-ого байта. Кроме битовый сдвига, можно как нито напрямую обратиться к конкретному байту переменной int?
2) Как можно решить обратную задачу: в определенный байт переменной типа int записать число unsigned char не используя сдвигов?
int iA;
BYTE* pbtA = (BYTE*)(&iA);
pbtA[0] - самый младший байт
pbtA[3] - самый старший байт
Можешь написать
BYTE btA0 = pbtA[0]; так ты считаешь байт
Можешь написать
pbtA[0] = 3; так ты решишь свою обратную задачу
Если нет #include <windows.h>, то неплохо бы заменить BYTE на unsigned char или написать
typedef unsigned char BYTE;
{
int a;
BYTE b[4];
}
и обращатся надо к соответствущему байту в b[] массиве.
Удачи.. :)
Народ!
1) Допустим у нас есть переменная типа int (или unsigned int), и она равна какому-то числу. Как можно переменной типа unsigned char приcвоить значение 2-ого, 3-его или 4-ого байта. Кроме битовый сдвига, можно как нито напрямую обратиться к конкретному байту переменной int?
2) Как можно решить обратную задачу: в определенный байт переменной типа int записать число unsigned char не используя сдвигов?
А можно так:
int a=918234670;// переменная для примера
char t = *((char*)&a+2); // в t записывается 2 бай переменной а, 0,1,2,3 - соответственно для других байтов
А вот обратная операция (запись в конкретный байт):
char b=7;
int a = 0;
*((char*)&a+2)= b;//*(int*)&Pss[0]//Записывает во 2 байт
Красиво и качественно, работает быстро, поскольку данное выражение поясняет компилятору что надо делать и в уже скомпилиной проге вычесления не происходят
А можно так:
int a=918234670;// переменная для примера
char t = *((char*)&a+2); // в t записывается 2 бай переменной а, 0,1,2,3 - соответственно для других байтов
А вот обратная операция (запись в конкретный байт):
char b=7;
int a = 0;
*((char*)&a+2)= b;//*(int*)&Pss[0]//Записывает во 2 байт
Красиво и качественно, работает быстро, поскольку данное выражение поясняет компилятору что надо делать и в уже скомпилиной проге вычесления не происходят
Да-а-а-а-а-а-а-а-а-а!
Если это красиво, то я - Кнут!
Используй объединения, а если кто-то думает, что
mov [ebx], al
работает быстрее, чем
mov [ebx + 2], al
То пусть использует страшные выражения с указателями.
Да-а-а-а-а-а-а-а-а-а!
Если это красиво, то я - Кнут!
Используй объединения, а если кто-то думает, что
mov [ebx], al
работает быстрее, чем
mov [ebx + 2], al
То пусть использует страшные выражения с указателями.
Все эти +2 не попадут в конечный код, все смещения в данном случае посчитает компилятор.
Но метод, действительно, не кроасивый, не наглядный.
Я бы предпочел метод, который привел S_T.
Объединения я не стал бы использовать, т.к. вводится новый тип данных и придется обращаться к полям этого типа.
Все эти +2 не попадут в конечный код, все смещения в данном случае посчитает компилятор.
Но метод, действительно, не кроасивый, не наглядный.
Я бы предпочел метод, который привел S_T.
Объединения я не стал бы использовать, т.к. вводится новый тип данных и придется обращаться к полям этого типа.
То, что метод ненаглядный (не в том смысле что красивый:) это правда. Но поскольку он небыл описан, то я его и написал.
Но он все-таки красивый в визуальном плане :) да и исходник попавший в нехорошие руки будет более нечитабельным :D