1

我只是在尝试使用 c 进行一些系统级编程。我遇到了一些模棱两可的事情,我希望这里有人可以为我解决。

如果我制作一个 char* 然后以下列方式将地址输入函数

char* string;
os_IntToString(&string, string);

void os_IntToString(int value, char* str) {
    int scancode_offset = 48;

    char* start = *str;
    do{
        int piece = value % 10;
        *str++ = piece + scancode_offset;
        value = value / 10;
    } while(value);
    *str-- = '\0';
}

那我到底要回来什么?我得到实数,一个例子是 589796。显然地址是向后的,但它是什么基本系统?

内存地址是十六进制的吧?但是该函数使用的是十进制基数为 10 的 Int?那是对的吗?是否发生了转换过程,或者我现在有一个十进制地址,我只是不知道。

任何人都可以解决这个问题。提前非常感谢。

4

3 回答 3

3

就 C 语言而言,地址不是“十六进制”,也不是数字。地址只是地址或指针值。根据您使用的系统的寻址方案,地址可能以十六进制表示(例如,如果使用printf's"%p"格式打印)。您还可以将地址转换为整数,但转换的结果是实现定义的——整数也不是“十六进制”,尽管您可以生成整数的人类可读的十六进制表示。(整数以二进制表示。)

至于您的函数,您已经用void返回类型定义了它,然后尝试从中返回一个char*值。如果不是致命错误,您至少应该从编译器那里得到警告。

于 2013-06-26T15:25:59.637 回答
2

所有数据(内存地址、整数、指针、字符串、浮点数等)在内部存储为二进制或 base 2。

以 10 为基数或以 16 为基数不是硬件或软件(libc、您的程序、程序集,甚至 CPU 微代码)如何存储和操作它的问题(二进制编码的十进制除外,除了某些显示和转换步骤)。

当您返回一个 int 时,虽然您假设它以 10 为底(并且大多数将打印 int 的调用将其显示为以 10 为底),但对于硬件而言,它的含义为以 2 为底,与指针或内存地址相同。它只是以这种方式打印。

此外,对于内存地址,base 2 只是由于电路在 CPU 和北桥中的运行方式。当您将其视为基数 16 时,它只是调试器的表示。我们可以假设它以 10 为底,并在内存中引用 65536,但它更容易10000用于显示,因为尾随零有助于提示程序员进行对齐。这只是一个方便的表示。我们可以使用基数 13 并将其称为 23AA3,但这很不方便。当我们把它看作一个数字时,它不一定是一个数字。它是一个位置,虽然在某些方面它可以被认为是一个数字,它很方便对于程序员来说,将其视为一个数字,当今系统上内存映射的非线性特性可能会使这种考虑有些不正确。

虽然代码本身可能存在问题,但我只是在回答数字表示的问题。

于 2013-06-26T15:24:10.220 回答
1

地址不是倒过来的。Printf 应该总是打印大端。如果您打印地址位置,如果您在 int 时获得 589796,如果您将其打印为十六进制,那么您将获得 0x8FFE4 = 589796。一切正常,因为无论您如何打印,它都会正确的内存地址,只是具有不同的表示。

于 2013-06-26T15:21:41.203 回答