我正在浏览memmove()与memcpy()Stack Overflow 相关的各种问题.
这篇文章暗示如果源地址(要复制的数据)大于目标地址(要复制的数据),它将执行正向复制,否则将执行向后复制.
为什么会那样?我尝试了两种情况下的复制,并且完美无缺,没有任何错误.
你能详细说明吗?我没理由.
编辑:这就是我的意思:
#include <memory.h>
#include <string.h>
#include <stdio.h>
void *memmoveCustom(void *dest, const void *src, size_t n)
{
unsigned char *pd = (unsigned char *)dest;
const unsigned char *ps = (unsigned char *)src;
if ( ps < pd )
for (pd += n, ps += n; n--;)
*--pd = *--ps;
else
while(n--)
*pd++ = *ps++;
return dest;
}
int main( void )
{
printf( "The string: %s\n", str1 );
memmoveCustom( str1 + …Run Code Online (Sandbox Code Playgroud) 我正在学习“C PRIMER PLUS”,有一个关于“OUTPUT FLUSHING”的话题。现在它说:
printf()语句将输出发送到称为缓冲区的中间存储器。每隔一段时间,缓冲区中的材料就会被发送到屏幕上。何时将输出从缓冲区发送到屏幕的标准 C 规则很明确:
- 当缓冲区已满时发送。
- 当遇到换行符时。
- 当有即将到来的输入时。
(将输出从缓冲区发送到屏幕或文件称为刷新缓冲区。)
现在,验证上述说法。我写了这个简单的程序:
#include<stdio.h>
int main(int argc, char** argv) {
printf("Hello World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此, printf() 既不包含新行,也不包含一些即将发生的输入(例如 scanf() 语句或任何其他输入语句)。那么为什么它会在输出屏幕上打印内容。
让我们假设第一个条件验证为真。缓冲区已满(这根本不可能发生)。牢记这一点,我将 printf() 中的语句截断为
printf("Hi");
Run Code Online (Sandbox Code Playgroud)
它仍然在控制台上打印语句。
那么这里有什么交易,上述所有条件都是错误的,但我仍然在屏幕上看到输出。你能详细说明一下吗。看来我在理解这个概念时犯了一个错误。任何帮助都受到高度赞赏。
编辑:正如一个非常有用的评论所建议的那样,可能在程序结束后执行 exit() 函数会导致所有缓冲区刷新,从而导致控制台上的输出。但是如果我们在执行 exit() 之前按住屏幕。像这样,
#include<stdio.h>
int main(int argc, char** argv) {
printf("Hello World!");
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它仍然在控制台上输出。
我是一个初学者,正在学习组装基础知识。现在,在阅读此问题时,我来到了这一段。它说明了如何将浮点数存储在内存中。
浮点数的指数是8位字段。为了允许存储大数或小数,将指数解释为正数或负数。实际指数是8位字段的值减去127。127是32位浮点数的“指数偏差”。浮点数的分数字段让人有些意外。由于将0.0定义为所有设置为0的位,因此无需担心将0.0表示为等于127的指数字段并将小数字段设置为所有O。所有其他数字至少具有一个1位,因此IEEE 754格式使用隐式1位来节省空间。因此,如果小数字段为00000000000000000000000,则将其解释为1。00000000000000000000000。这允许分数字段有效地为24位。
我一点都不明白。
您能解释一下它们如何存储在内存中吗?我不需要参考,我只需要一个很好的解释即可轻松理解。