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

point to low byte address of variable in c

我想了解这是否可行:

例如:

我们有 long Lvalue = 0xFF00f41a;

还有 int *p;

我们可以指向左值的最后 2 个字节吗

喜欢p=&Lvalue <<16;

p指向第一个16位值这可能吗?

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

那么如果

p = 0xa011;

long 左值 ---> 0xFF00a011

其实我需要位运算。我有 32 位值,但我只能发送 16 位,如果我更改 16 位,则必须更改 32 位值的前 16 位最后 16 位。

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

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

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

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

不要使用指针访问部分 32 位值,当您取消引用它时,它会产生未定义的行为。

如果 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;