2016-04-27 2 views
0

Я хочу узнать, если это возможно:указывают на низкий адрес байта переменной с

напр:

мы имеем длинный Lvalue = 0xFF00f41a;

а также имеют int * p;

Можем ли мы указать на последние 2 байта Lvalue

как p=&Lvalue <<16;

р заостренные Фрист 16 битное значение это возможно?

*p --> f41a; 
*(p+1) --->0xFF00; 

затем, если

p = 0xa011; 

долго Lvalue ---> 0xFF00a011

на самом деле мне нужно битовые операции. У меня есть 32-битное значение, но я могу отправить только 16 бит, и если я изменил 16 бит, нужно изменить первый 16-разрядный последний 16 бит 32-битного значения.

+3

Ваш вопрос очень смущен. Что вы хотите и как это связано с указателями? См. [Ask] и укажите [mcve] – Olaf

+0

Если я правильно понял, вы хотите изменить нижнюю 'int' часть указателей' long'; Нет, это невозможно. Это нарушает правило строгого сглаживания. – edmz

ответ

1

После небольшой пример будет работать, если int выравнивается по 4 байта (которые, как представляется, гарантируется gcc см Casting an int pointer to a char ptr and vice versa):

#include <stdio.h>                                                

int main() {                                                 
    int v = 0xcafe;                                        
    int *ip = &v;                                                
    char *cp = (char*) ip;                                              

    printf("%hhX\n", *cp); // FE on little-endian box                                              
    printf("%hhX\n", *(cp + 1));                                            

    *cp = 0xbe;                                                 
    *(cp + 1) = 0xba;                                               
    printf("%X\n", *ip);                                              

    return 0;                                                 
} 

Вы можете гарантировать выравнивание int таким образом:

int main() {                                                 
    __attribute__ ((aligned (4))) int v = 0xcafe;            
+0

Большое спасибо @Victor Sorokin –

+0

Вы меняете часть целого с помощью указателя char. Это плохая привычка C. – fluter

+0

почему это плохо @flutter –

3

Если вы просто хотите 16bits из большего типа 32бит, использовать битовую маску для выполнения этой задачи, например, чтобы получить нижние 16 бит значения:

long value = 0xFF00f41a; 
long lower = value & 0xFFFF; 

Чтобы изменить нижние 16 бит значения, использование бит операции:

lower = <some thing new>; 
value = (value & 0xFFFF0000) | lower; 

не используйте указатель для доступа к части 32-битное значение, то ящики неопределенную bahavior когда вы разыменования его.

+0

да, но мне нужно изменить ниже и изменить значение ниже –

+0

@ dev.burak, чтобы изменить нижнюю часть снова, используя поразрядное и/или. – fluter

Смежные вопросы