long double i, *ptr;
ptr = &i;
我想修改第4个字节的值。long double的大小是8个字节。那么可以通过从 *ptr 中减去 4 来实现吗?IE
(ptr)-4 = 9;
您可以通过将指向对象的指针转换为指向的指针unsigned char
,然后通过该指针访问字节来访问表示对象的字节。例如,i
可以通过以下方式将 的第四个字节设置为 9:
unsigned char *p = (unsigned char *) &i;
*(p+4) = 9;
但是,您不应在没有充分理由的情况下这样做。它会遇到可移植性问题,并且应该仅用于特殊目的并仔细注意 C 标准和/或 C 实现的文档。如果您进一步解释为什么要这样做,则可能会显示出更好的方法或解释危险。
请注意,字节四(字节零的起始编号)的正确地址是p+4
,而不是p-4
问题中使用的地址。
我会尝试一些更具可读性的东西
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
首先看这里:如何在 C 中仅设置字节的某些位而不影响其余位?. 这个想法是清除您感兴趣的字节,然后使用或操作设置您的值。所以在你的情况下,你会这样做:
val &= ~0xff; // Clear lower byte
val |= 9 & 0xff; // Set Nine into the least significant byte.
(*ptr)-4 = 9
不允许,因为它会导致 RValue 违规(赋值操作的右侧不能是另一个操作)。
但是您可以使用以下位操作:
(*ptr) = (*ptr) & 0x00009000;