2016-04-27 3 views
0

ich lernen will, wenn dies möglich ist:Punkt auf Low-Byte-Adresse der Variablen in c

für ex:

wir haben lange L-Wert = 0xFF00f41a;

und auch int * p;

Können wir Punkt 2 Byte von L-Wert

wie p=&Lvalue <<16;

p dauern spitz frist 16-Bit-Wert ist es möglich?

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

dann, wenn

p = 0xa011; 

lange L-Wert ---> 0xFF00a011

eigentlich brauche ich Bit-Operationen. Ich habe 32-Bit-Wert, aber ich kann nur 16 Bits senden, und wenn ich 16 Bit ändern, müssen zuerst 16 Bit letzten 16 Bit von 32 Bit Wert ändern.

+3

Ihre Frage ist sehr verwirrt. Was willst du und wie ist das mit Zeigern verbunden? Siehe [ask] und stelle eine [mcve] – Olaf

+0

bereit Wenn ich es richtig verstanden habe, willst du den unteren 'int' Teil von' long' durch Zeiger ändern; Nein das ist nicht möglich. Es bricht die strenge Aliasing-Regel. – edmz

Antwort

1

Nach kurzem Beispiel wird funktionieren, wenn int auf 4-Byte ausgerichtet ist (die durch gcc garantiert zu sein scheint, sehen 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;                                                 
} 

Sie Ausrichtung von int so garantieren kann:

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

Vielen Dank @Victor Sorokin –

+0

Sie ändern einen Teil der ganzen Zahl über einen Char-Zeiger. Das ist die schlechte C-Gewohnheit. – fluter

+0

Warum ist es schlecht @flutter –

3

Wenn Sie nur wollen, 16bits der größeren 32-Bit-Typ, Bitmaske für die Aufgabe verwenden, beispielsweise die unteren 16 Bit-Wert zu erhalten:

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

Um die unteren 16 Bits Wert zu ändern, Verwendung Bit-Betrieb:

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

nicht Zeiger verwenden Sie ein Teil des 32-Bit-Wert zuzugreifen, Kisten, um es undefined bahavior wenn Sie dereferenzieren.

+0

yeah, aber ich brauche ändern niedriger und ändern Wert von niedrigeren –

+0

@ dev.burak, um den unteren Teil wieder zu ändern verwenden Sie Bitwise und und oder. – fluter

Verwandte Themen