0
long double i, *ptr;
ptr = &i;

我想修改第4个字节的值。long double的大小是8个字节。那么可以通过从 *ptr 中减去 4 来实现吗?IE

(ptr)-4 = 9;
4

4 回答 4

7

您可以通过将指向对象的指针转换为指向的指针unsigned char,然后通过该指针访问字节来访问表示对象的字节。例如,i可以通过以下方式将 的第四个字节设置为 9:

unsigned char *p = (unsigned char *) &i;
*(p+4) = 9;

但是,您不应在没有充分理由的情况下这样做。它会遇到可移植性问题,并且应该仅用于特殊目的并仔细注意 C 标准和/或 C 实现的文档。如果您进一步解释为什么要这样做,则可能会显示出更好的方法或解释危险。

请注意,字节四(字节零的起始编号)的正确地址是p+4,而不是p-4问题中使用的地址。

于 2013-04-25T18:15:17.107 回答
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
于 2013-04-25T18:17:55.497 回答
0

首先看这里:如何在 C 中仅设置字节的某些位而不影响其余位?. 这个想法是清除您感兴趣的字节,然后使用或操作设置您的值。所以在你的情况下,你会这样做:

val &= ~0xff;    // Clear lower byte
val |= 9 & 0xff; // Set Nine into the least significant byte. 
于 2013-04-25T18:14:14.000 回答
0

(*ptr)-4 = 9不允许,因为它会导致 RValue 违规(赋值操作的右侧不能是另一个操作)。

但是您可以使用以下位操作:

(*ptr) = (*ptr) & 0x00009000;

于 2013-04-25T18:04:38.020 回答