我正在尝试使用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? 那是对的吗?转换过程是否发生,或者我现在有一个deciaml地址,我只是不知道。
任何人都可以清楚这一点。非常感谢提前。
答案 0 :(得分:3)
就C语言而言,地址不是“十六进制”,也不是数字。地址只是地址或指针值。根据您正在使用的系统的寻址方案,地址可能以十六进制表示(例如,如果使用printf
的{{1}}格式打印)。您也可以将地址转换为整数,但转换的结果是实现定义的 - 并且整数也不是“十六进制”,尽管您可以生成一个人类可读的整数十六进制表示。 (整数用二进制表示。)
对于您的函数,您已使用"%p"
返回类型对其进行了定义,然后尝试从中返回void
值。如果不是致命的错误,你应该从编译器得到至少警告。
答案 1 :(得分:2)
所有数据(内存地址,整数,指针,字符串,浮点数等)都在内部存储为二进制或基数2.
作为基数10或基数16不是硬件或软件(libc,你的程序,可能的,甚至是CPU微码)如何存储和操作它的问题(二进制编码的十进制除外,很少使用除了某些显示和转换步骤)。
当你返回一个int时,你将它假设为基数10(并且大多数将打印int的调用显示为基数10),对于硬件,它保持其含义为基数2,与指针或内存地址。它只是以这种方式打印出来。
此外,对于存储器地址,基极2仅仅是由于电路在CPU和北桥中的运行方式。当您将其视为基数16时,它只是调试器的表示。我们可以假设将它作为基数10并在内存中引用65536但是更容易使用10000
进行显示,因为尾随零有助于程序员进入对齐。这只是一个方便的代表。我们可以使用base 13并将其命名为23AA3,但这样会很不方便。当我们将其视为数字时,它不一定是数字。它是一个位置,虽然在某些方面它可以被认为是一个数字,并且方便让程序员将它看作一个数字,即内存的非线性特性在今天的系统上进行映射会使这种考虑有些不正确。
虽然代码本身可能存在问题,但我只是回答数字表示的问题。
答案 2 :(得分:1)
地址不是倒退的。 Printf shoudl总是打印大端。如果你打印地址位置,如果你得到一个int 589796,如果你打印为十六进制,那么你将得到0x8FFE4 = 589796.一切正常,因为无论你打印它,它将是正确的内存地址,只是表示不同。