指向c中变量的低字节地址

时间:2016-04-27 12:39:51

标签: c pointers bit bitwise-and

我想知道这是否可行:

代表:

我们有长Lvalue = 0xFF00f41a;

并且还有 int * p;

我们可以指向Lvalue的最后2个字节

喜欢 p=&Lvalue <<16;

p指向frist 16位值是否可能?

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

然后如果

p = 0xa011;

长Lvalue ---&gt; 0xFF00a011

实际上我需要位操作。我有32位值,但我只能发送16位,如果我改变16位必须改变前16位的最后16位32位值。

2 个答案:

答案 0 :(得分:3)

如果您只想要16位较大的32位类型,请使用位掩码执行任务,例如,获取较低的16位值:

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

要更改值的低16位,请使用位操作:

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

不要使用指针来访问32位值的一部分,当你取消引用时,它会包含未定义的行为。

答案 1 :(得分: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;