|
27
|
| whacko__Cracko · 技术社区 · 16 年前 |
|
|
1
27
例如
给一个工会成员写信,读另一个工会成员的信 通常 it may be useful for programs compiled with strict aliasing |
|
|
2
19
这个问题的答案取决于历史背景,因为语言的规格随时间而变化。而这件事恰好是受这些变化影响的。 未定义的行为 . 不 (这是另一回事),但是 未定义 现在,在C语言发展的后期(应用了技术勘误3的C99语言规范版本),使用union进行类型双关(typepunning)突然变得合法,即写union的一个成员,然后读另一个成员。 请注意,尝试这样做仍然会导致未定义的行为。如果您读取的值恰好对您读取的类型无效(所谓的“陷阱表示”),则该行为仍然未定义。否则,您读取的值是实现定义的。
具体的
示例对于从
但在你的特殊情况下,如果
|
|
|
3
9
输出背后的原因是,在您的机器上,整数存储在 little-endian 格式:首先存储最低有效字节。因此是字节序列 [3,2,0,0]表示整数3+2*256=515。 这一结果取决于具体的实现和平台。 |
|
|
4
5
这些代码的输出将取决于您的平台和C编译器实现。您的输出让我觉得您正在litte-endian系统(可能是x86)上运行此代码。如果将515放入i并在调试器中查看它,您将看到最低顺序的字节将是3,内存中的下一个字节将是2,这正好映射到您放入ch中的内容。 如果在big-endian系统上执行此操作,则可能会得到770(假设为16位整数)或50462720(假设为32位整数)。 |
|
|
5
5
这取决于实现,结果可能在不同的平台/编译器上有所不同,但似乎情况就是这样: 515二进制是
将零填充为两个字节(假设为16位整数):
那是
希望有人能解释为什么它们是颠倒的-我的猜测是,字符不是颠倒的,但int是小端的。 分配给联合体的内存量等于存储最大成员所需的内存量。在本例中,您有一个长度为2的int和char数组。假设int为16位,char为8位,两者都需要相同的空间,因此并集分配了两个字节。
注意:即使int是32位检查,这也是正确的 Amnon's answer |
|
|
6
3
如果您在32位系统上,那么int是4个字节,但您只初始化了2个字节。访问未初始化的数据是未定义的行为。 假设您在一个具有16位整数的系统上,那么您所做的仍然是实现定义的。如果您的系统是little endian,那么u.ch[0]将与u.i和u.ch的最低有效字节相对应 1 将是最重要的字节。在大端系统中,情况正好相反。此外,C标准并不强制实现使用 two's complement 提示:如果使用十六进制值,更容易看到发生了什么。在小endian系统中,十六进制的结果将是0x0203。 |