【问题标题】:What is the meaning of this short code?这个短代码是什么意思?
【发布时间】:2015-02-05 13:20:16
【问题描述】:

我有这个代码。它打印 ABBAA,我不知道为什么。 16961 的表现如何?这个数字是什么意思?

#include <stdio.h>
int main() {
short a[]={'A',16961,16706,65,16961,16706};
printf("%s\n",&((char*)a)[2]);
return 0;
}

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。在调试器中逐步运行程序 (gdb)。阅读endianessundefined behavior
  • 看到那里的char* 的转换了吗?想想像16961 这样的两字节值如果分成两个字节会是什么,并查看例如this ASCII table.
  • 这是测试机器字节序的好方法。 ABBAA 是 little-endian,我猜您应该在 big-endian 机器上使用 BAAB(对于 shorts 都有 16 位)。 (提示:字符串结束字符是 C 中的 0

标签: c string printf


【解决方案1】:

您有一个 shorts 数组(通常是 2 个字节长),所以让我们将它们转换为 chars(字节)。为简单起见,我们将使用十六进制基础(因为操作字节非常方便)。

十进制16961等于十六进制4241(通常写为0x4241),16706等于4142,而65等于0041。 Ascii(0x41)=Ascii(65) 是A,ASCII(0x42) 是B&amp;((char*)a)[2]指向表的第三个字节,我们知道第一个打印的char是A

现在让我们看看内存中可能有什么:

  • 如果您的机器是大端模式,您将有字节 NUL、ABAAB、NUL、A
  • 如果你的机器是小端的,你将有A、NUL、ABBAA、NUL

所以我们知道您的机器是小端机器。 printf 从第三个到第一个遇到的 NUL 每隔一个 chars 写入:ABBAA

【讨论】:

  • 我已经阅读了 5 次,但我仍然不明白 NUL 的来源。
  • short(通常)是 16 位长,这意味着存储在 short 中的任何数字都是使用 16 位写入的!因此,如果我需要存储值 65(Ascii 中的A),则存储在短格式中的值等于 0000000001000001(二进制)。现在 16 位组成 2 个字节(一个字节长 8 位),所以我们有字节 00000000 和字节 01000001,十进制字节 0 和 65 或十六进制字节 0x00 和 0x41。 NUL 是空字节(所有位都归零)。
  • 您可以在标准公园位置停放一辆小型汽车,“额外空间”就在那里,免费。公园的位置总是相同的大小,但汽车可能会有所不同。微小的值会在左侧留下许多零...
  • @avital 你把'A'(8位)存储在一个短的(16位)中,剩下的8位全为零……
猜你喜欢
  • 2011-05-28
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多