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



我想了解这是否可能:

例如:

我们有长左值 = 0xFF00f41a;

并且还有 int *p;

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

喜欢p=&Lvalue <<16;

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

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

那么如果

p = 0xa011;

长Lvalue ---> 0xFF00a011

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

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

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

要更改较低的 16 位值,请使用位运算:

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

不要使用指针来访问 32 位值的一部分,当您取消引用它时,它会将未定义的 bahavior 箱子。

如果

int在 4 字节上对齐(这似乎是由 gcc 保证的,则以下简短示例将起作用,请参阅将 int 指针转换为 char ptr,反之亦然):

#include <stdio.h>                                                                                                                                                                                             
int main() {                                                                                                                                                                                                   
    int v = 0xcafe;                                                                                                                                                              
    int *ip = &v;                                                                                                                                                                                              
    char *cp = (char*) ip;                                                                                                                                                                                     
    printf("%hhXn", *cp); // FE on little-endian box                                                                                                                                                                                    
    printf("%hhXn", *(cp + 1));                                                                                                                                                                               
    *cp = 0xbe;                                                                                                                                                                                                
    *(cp + 1) = 0xba;                                                                                                                                                                                          
    printf("%Xn", *ip);                                                                                                                                                                                       
    return 0;                                                                                                                                                                                                  
}

您可以通过以下方式保证int对齐:

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

最新更新