long double i, *ptr;
ptr = &i;
我想修改字节No.4的值。长double的大小是8字节。那么可以从* ptr中减去4吗? 即
(ptr)-4 = 9;
答案 0 :(得分:7)
您可以通过将指向对象的指针转换为指向unsigned char
的指针然后通过该指针访问字节来访问表示对象的字节。例如,i
的第四个字节可以通过以下方式设置为9:
unsigned char *p = (unsigned char *) &i;
*(p+4) = 9;
然而,你没有充分理由不这样做。它遇到了可移植性问题,只能用于特殊目的,并且要特别注意C标准和/或C实现的文档。如果你进一步解释为什么要做这样的事情,可能会有更好的方法来解释它或解释危险。
请注意,问题中使用的字节4(字节0处的起始编号)的正确地址为p+4
,而不是p-4
。
答案 1 :(得分:3)
我会尝试更具可读性的东西
union {
long double d;
char v[sizeof(long double)];
} x;
x.d = 1234567890;
std::cout << x.d << ' ' << int(x.v[6]) << std::endl;
x.v[6] = 0xCC;
std::cout << x.d << ' ' << int(x.v[6]) << std::endl;
产量
1.23457e+09 44
1.23981e+09 -52
答案 2 :(得分:0)
(*ptr)-4 = 9
是不允许的,因为它会导致RValue违规(分配操作的右侧不能是另一个操作)。
但您可以使用位操作,例如:
(*ptr) = (*ptr) & 0x00009000;
答案 3 :(得分:0)
首先看到这里:How do you set only certain bits of a byte in C without affecting the rest?。我们的想法是清除您感兴趣的字节,然后使用或操作设置您的值。所以在你的情况下你会这样做:
val &= ~0xff; // Clear lower byte
val |= 9 & 0xff; // Set Nine into the least significant byte.