我想了解这是否可能:
例如:
我们有长左值 = 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;