【问题标题】:C Language Access memory as binary [closed]C语言作为二进制访问内存[关闭]
【发布时间】:2018-11-23 21:01:45
【问题描述】:

基本上我要问的是:

当我执行 a + b = c 时,c 以二进制形式存储在内存中。

如何访问那部分内存并以该形式检索 c 并在以后使用它。

示例: 2 + 3 = 5 , 5 存储为 "0101" 。变量d,将检索结果“0101”,我将能够输出它。

【问题讨论】:

  • Decimal to Binary的可能重复
  • 另外,“检索”c 的值只是获取一个指针,即int *d = &c;
  • @ahota “检索”c 处的值是 [...] – 否。int *d = &c; 正在定义一个变量 @ 987654326@ 类型指针指向int 并使用变量c 的地址对其进行初始化。
  • 我想我可以更准确地使用那个陈述。最终的重点是除了使用指针之外没有特殊的检索过程。
  • "不使用任何转换,只使用处理器本身生成的转换" - 由于没有 CPU,甚至 GPU 或著名的 TMS34020 都没有从位向量绘制字形的指令在屏幕上,这是不可能的。

标签: c memory binary


【解决方案1】:

我猜你搞砸了数据在计算机世界中的表示方式。内存中的所有数据是二进制的,由位组成,这些位按字分组。在 64 位系统上,内存字由 64 位组成。每个位都可以有值'on'或'off' => '1'或'0';

变量只是内存中保存数据的位置的符号名称。即

int i;

在内存中保留一个足以在“c”中包含整数值的位置。默认情况下,'c' 中的此类值通常(取决于操作系统)为 32 位宽。

int a, b, c;
a = 2;
b = 3;
c = a + b;

以上所有变量都与内存中的不同位置相关。只要内存中的位置存在并且有人将其更改为不同的值,'c' 将包含 5。

printf ("%d", c);

上面的函数转换二进制值'c'到字符值'5'并打印在屏幕上。这样您将在屏幕上看到“5”。 '%d' 告诉函数'c' 是一个十进制整数值。

每个字符本身也由一个 int 值表示,尽管在 ascii 编码方案中它只需要 '8' 位来表示。因此,字符 '5' 被编码为 int 值 53。

 print("%c", '5') // will print '5'
 print("%d", '5') // will print 53

逐位打印二进制数更加困难。 printf 中没有这样的格式说明符。所以,你需要编写一个小程序,逐位分析数字并打印出来:

#include <stdio.h>

int main() {
  int a=2, b= 3, c = a+b;

  for (int bit = 31; bit >= 0; --bit) {
     if (((c >> bit) & 1) == 0)
        printf("0");
     else
        printf("1");
  }
  printf("\n");
  return 0;
}

结果是:00000000000000000000000000000101

【讨论】:

  • "……在计算机世界中。内存中的所有数据都是二进制的……" - 好吧,有些吹毛求疵,因为不清楚 OP 实际上是什么(我同意“混淆”部分,不过)。撇开模拟计算机和其他内部使用十进制或其他数字系统的经典计算机不谈,当今用于大容量存储的几乎所有闪存都使用四元或更高级别的内部表示。
【解决方案2】:

您需要为此使用指针!

int *c =(int *) malloc(sizeof(int));
*c = a+b;

稍后要检索该值,请执行以下操作:

int value = *c;

C 用于硬件和操作系统的原因实际上是这样的。您可以直接访问内存并对其进行修改。

请注意,当您保存该值时,无论如何它都会保存为二进制文件。

当您检索它时,您不能直接将其打印为二进制文件。因此,您可以使用 https://www.sanfoundry.com/c-program-number-decimal-to-binary-recursion/ 之类的函数将其转换为二进制并打印出来。

【讨论】:

  • "...当您保存该值时,它将被保存为二进制文件。" OP 似乎相信这意味着您可以检索这些单独的位。 (诚​​然,您可以,但不能通过阅读个别的 0 和 1。)
  • @Swordfish 我猜那句话是错误的。因为它仍然作为二进制值保存在内存中。已编辑。
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 2022-07-13
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多