我想知道这是否可行:
代表:
我们有长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位值。
答案 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;