【问题标题】:How are ints stored in CC中int是如何存储的
【发布时间】:2023-01-03 09:48:30
【问题描述】:

我一直试图了解数据是如何存储在 C 中的,但我感到很困惑。我有这段代码:

 int main(){ 
 int a; 
 char *x; 
 x = (char *) &a; 
 x[0] = 0; 
 x[1] = 3;
 printf("%d\n", a); 
return 0; 
} 

我一直在摆弄 x[0] & x[1],试图弄清楚它们是如何工作的,但我做不到。例如 x[1] = 3 输出 768。为什么?

我知道 int 中有 4 个字节(每个字节有 8 位),x[1] 指向第二个字节。但我不明白如何使第二个字节等于 3,意味着 a = 768。

我可以用二进制格式将其可视化:

字节 1:00000000

字节 2:00000011

字节 3:00000000

字节 4:00000000

但是 3 在哪里发挥作用呢?如何做字节 2 = 3,使其成为 00000011 或 768。

附加问题:如果让我在内存中存储545。 a[0] 和 a[1] = 什么?

我知道二进制布局是:

字节 1:00100001

字节 2:00000010

字节 3:00000000

字节 4:00000000

【问题讨论】:

  • 768 = 512 + 256 = 2^9 + 2^8...这有帮助吗?
  • 请注意,如今在许多机器上,键入 int 是 4 个字节(32 位),因此在您的示例代码中,您需要添加 x[2] = x[3] = 0; 以获得一致的结果。
  • @SteveSummit ... 或int a = 0; 强调口头禅“总是初始化变量”:-)
  • 我仍然看不出 3 在哪里发挥作用。但我想我想出了一个方法。只需以二进制形式将其写出,然后通过对所有字节使用第一个字节 (1,2,...128) 的小数位数将其转换为 denary。所以对于 768,第二个字节是 00000011,这在第一个字节 (1-128) 的范围内等于 3,所以第二个字节 = 3。

标签: c memory memory-management integer byte


【解决方案1】:

它不是特定于 C 的,它是您的计算机存储数据的方式。

有两种不同的方法称为字节顺序。

  1. Little-endian:首先存储最低有效字节。 示例:0x11223344 将存储为 0x44 0x33 0x22 0x11

  2. Big-endian:最低有效字节最后存储。 示例:0x11223344 将存储为 0x11 0x22 0x33 0x44

    大多数现代计算机都使用小端系统。

    附加问题:如果让我在内存中存储545

    十六进制的 545 是 0x221,所以第一个字节将是 0x21 and the second one 0x02,因为您的计算机是小端。

    为什么我使用十六进制数?因为每两个数字正好代表内存中的一个字节。

    我一直在弄乱 x[0] & x[1],试图弄清楚如何 他们工作,但我不能。例如 x[1] = 3 输出 768。为什么?

    768 的十六进制是 0x300。所以字节表示是0x00 0x03 0x00 0x00

【讨论】:

  • 我想我找到了一种从二进制形式获取二进制形式字节的方法。对于第一个字节,它只是那个数字。对于第二个字节,它是那个数字,但在第一个字节的范围内 (0-128),所以如果 256 以下有一个 1,则等于 1。如果 512 以下有一个 1,则等于 2 等等。这是正确的吗?我需要为我当前的工作使用 denary over hex。
  • @compsci3289294 I think i found a method to get the bytes in denary - 不要浪费你的时间。像所有程序员一样使用十六进制或八进制数。尝试与 2882400069 相同
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2014-10-22
  • 2014-11-30
  • 2020-03-26
  • 2010-09-29
  • 2018-03-05
相关资源
最近更新 更多