鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 11063216906

[已解决]浮点数存取问题

[复制链接]
 楼主| 发表于 2026-7-11 21:45:25 | 显示全部楼层
@FishC C语言中 %s和%c分别表示什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-11 21:45:34 | 显示全部楼层
11063216906 发表于 2026-07-11 21:45
@FishC C语言中 %s和%c分别表示什么


C语言中 %s%c 都是格式占位符,用在 printfscanf 等函数中,告诉程序要处理的数据类型。

%c 代表 单个字符(char),例如:
  1. printf("%c", 'A');
复制代码
会输出大写字母 A。

%s 代表 字符串(string),也就是一个以 \0 结尾的字符数组,例如:
  1. printf("%s", "Hello");
复制代码
会输出 Hello。

简单记:%c 是一个字符,%s 是一串字符(字符串)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-11 21:47:57 | 显示全部楼层
FishC 发表于 2026-7-11 21:45
[s]C语言中 %s 和 %c 都是格式占位符,用在 printf 或 scanf 等函数中,告诉程序要处理的数据类型。[/s ...

我现在用char *s = "HI!";
printf("%s", s);       // HI!
printf("%s", s + 1);   // I!

printf("%c", *s);      // H
printf("%c", *(s + 1));// I
他们的输出结果是什么 为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-11 21:48:05 | 显示全部楼层
11063216906 发表于 2026-07-11 21:47
FishC 发表于 2026-7-11 21:45
C语言中 %s 和 %c 都 ...


第一个 printf("%s", s); 输出 HI!  
因为 s 指向字符串 "HI!" 的首字符 'H'%s 会从该地址开始输出直到遇到 '\0'。  

第二个 printf("%s", s + 1); 输出 I!  
因为 s + 1 指向第二个字符 'I',从那里开始输出到结尾。  

第三个 printf("%c", *s); 输出 H  
*s 解引用得到第一个字符 'H'%c 打印单个字符。  

第四个 printf("%c", *(s + 1)); 输出 I  
*(s + 1) 得到第二个字符 'I'

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-11 21:50:25 | 显示全部楼层
FishC 发表于 2026-7-11 21:48
第一个 printf("%s", s); 输出 HI!  
因为 s 指向字符串 "HI!" 的首字符 'H',%s 会从该地址开始输出 ...

我在第一个printf("%s", s); 中我可以用printf("%s", *s); 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-11 21:50:29 | 显示全部楼层
11063216906 发表于 2026-07-11 21:50
FishC 发表于 2026-7-11 21:48
第一个 printf("%s",  ...


不能。`%s` 要求传入一个指向字符串首字符的指针(即 `char*` 类型),而 `*s` 是解引用后得到的单个字符(`char` 类型),类型不匹配。尝试使用 `printf("%s", *s);` 会导致未定义行为,因为程序会试图将字符值解释为地址,通常会导致程序崩溃或输出乱码。  

正确写法是 `printf("%s", s);` 或者 `printf("%s", &(*s));`(这样多此一举),但直接传指针即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-12 13:15:20 | 显示全部楼层
FishC 发表于 2026-7-11 21:50
不能。`%s` 要求传入一个指向字符串首字符的指针(即 `char*` 类型),而 `*s` 是解引用后得到的单个字 ...

malloc在C中干嘛的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-12 13:15:24 | 显示全部楼层
11063216906 发表于 2026-07-12 13:15
FishC 发表于 2026-7-11 21:50
不能。`%s` 要求传入 ...


malloc 是 C 语言中用来在程序运行时 动态分配内存 的函数。它的作用是在堆(heap)上申请一块指定大小的连续内存空间,并返回指向这块内存首地址的指针。如果你需要创建大小不固定或需要在函数返回后依然有效的数组/结构体,就可以用 malloc。例如:  

  1.   
  2. int *p = (int*)malloc(10 * sizeof(int));  
复制代码


这行代码申请了一块能存放 10 个 int 类型数据的内存,返回的指针赋值给 p。使用完毕后,记得用 free(p) 释放内存,否则会造成内存泄漏。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-12 16:48:53 | 显示全部楼层
FishC 发表于 2026-7-12 13:15
malloc 是 C 语言中用来在程序运行时 动态分配内存 的函数。它的作用是在堆(heap)上申请一块指定大小 ...

堆和栈的区别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-12 16:48:58 | 显示全部楼层
11063216906 发表于 2026-07-12 16:48
FishC 发表于 2026-7-12 13:15
malloc 是 C 语言中用 ...


堆(Heap)和栈(Stack)是C语言(及其他编程语言)中两种重要的内存区域,主要区别如下:

栈(Stack)  
- 由编译器自动管理,用于存储局部变量、函数调用参数、返回地址等。  
- 分配速度快,因为它是连续分配,且遵循后进先出(LIFO)原则。  
- 每个线程有自己的栈,大小通常固定(如1MB~8MB),超出会栈溢出。  
- 变量生命周期随函数调用结束而自动销毁,无需手动释放。

堆(Heap)  
- 由程序员通过 malloc()calloc() 等函数手动分配,通过 free() 释放。  
- 分配速度较慢,因为需要查找空闲内存块,且可能产生碎片。  
- 所有线程共享一个堆(但访问需加锁),大小受限于系统物理内存/虚拟内存。  
- 变量生命周期由程序员控制,不会自动释放,必须手动释放,否则会造成内存泄漏。

简单记:栈是自动管理、速度快、空间小;堆是手动管理、速度较慢、空间大(可动态扩展)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-12 16:51:35 | 显示全部楼层
FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stack)是C语言(及其他编程语言)中两种重要的内存区域,主要区别如下:

栈(Stac ...

堆是遵循fifo吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-12 16:51:42 | 显示全部楼层
11063216906 发表于 2026-07-12 16:51
FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stac ...


不是的,堆(heap)不遵循FIFO(先进先出)。堆是一种自由存储区域,程序员可以任意顺序分配和释放内存块,与分配的顺序无关。例如,你可以先分配A,再分配B,然后先释放A再释放B,或者先释放B再释放A,都是允许的。系统只负责在空闲内存中寻找合适大小的块,并不强加任何顺序约束。你提到的FIFO通常用于队列(queue)数据结构,而不是内存管理中的堆。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-12 16:55:16 | 显示全部楼层
FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stack)是C语言(及其他编程语言)中两种重要的内存区域,主要区别如下:

栈(Stac ...

scanf有什么用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-12 16:55:20 | 显示全部楼层
11063216906 发表于 2026-07-12 16:55
FishC 发表于 2026-7-12 16:48
堆(Heap)和栈(Stac ...


scanf 是 C 标准库中的一个输入函数,用于从标准输入(通常是键盘)读取数据,并根据指定的格式字符串将读取到的内容存入变量中。例如:


  1. int age;
  2. scanf("%d", &age);   // 读取一个整数并存入 age 变量
复制代码


注意:变量前必须加 & 取地址符(除了数组名本身已是指针的情况)。它相当于 printf 的反向操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-7-12 17:03:42 | 显示全部楼层
FishC 发表于 2026-7-12 16:55
scanf 是 C 标准库中的一个输入函数,用于从标准输入(通常是键盘)读取数据,并根据指定的格式字符串 ...

给我解释一下file I/O
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-7-12 17:03:50 | 显示全部楼层
11063216906 发表于 2026-07-12 17:03
FishC 发表于 2026-7-12 16:55
scanf 是 C 标准库中 ...


文件 I/O(Input/Output)即文件输入输出,是程序与硬盘上的文件之间进行数据交换的过程。  

- 输入(Input)指从文件读取数据到程序内存;  
- 输出(Output)指将程序内存中的数据写入文件。  

C 语言中通过标准库函数(如 fopen、fclose、fread、fwrite、fprintf、fscanf)来操作文件。基本步骤:  
1. 用 fopen() 打开文件,获得一个 FILE* 指针;  
2. 通过该指针调用读写函数;  
3. 使用完毕后用 fclose() 关闭文件。  

例如:  
  1.   
  2. FILE *fp = fopen("data.txt", "r");  // 以读模式打开  
  3. if (fp != NULL) {  
  4.     char ch = fgetc(fp);            // 读取一个字符  
  5.     fclose(fp);  
  6. }  
复制代码


文件 I/O 让程序可以持久化存储数据,或读取配置文件、日志等,是编程中非常基础且重要的能力。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 09:48 | 显示全部楼层
FishC 发表于 2026-7-12 17:03
文件 I/O(Input/Output)即文件输入输出,是程序与硬盘上的文件之间进行数据交换的过程。  

- 输入 ...

我还有个问题 在C语言中  我用signed int存储(2 ^32 )-1 的结果 为什么和 unsigned情况下不同 哪个是正确的 我该如何理解这件事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 09:49 | 显示全部楼层
11063216906 发表于 2026-08-01 09:48
FishC 发表于 2026-7-12 17:03
文件 I/O(Input/Outp ...


这是一个非常典型且重要的概念:**计算机存储的是二进制位,类型决定了解释方式**。

假设你的 intunsigned int 都是32位。(2^32)-1 的二进制结果是 **32个1**,即:

  1. 11111111 11111111 11111111 11111111
复制代码


现在将这个位模式分别赋给两种类型:

- 如果存入 unsigned int,它按无符号规则解释,最高位不再是符号位,所以这个位模式就是 4294967295。

- 如果存入 signed int,它按补码解释,最高位是符号位(1表示负数),32个1对应的补码值正好是 -1。

所以两个结果都“正确”,但前提是:这个数值在对应类型的范围内。4294967295 超出了 signed int 的最大值,属于溢出,结果是实现定义行为(多数编译器直接得到 -1)。而 unsigned int 能完全表示它,所以得到 4294967295。

理解的关键是:**内存里存的位一模一样,只是读法不同**。类型系统告诉你这些位该怎么翻译。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 10:03 | 显示全部楼层
FishC 发表于 2026-8-1 09:49
这是一个非常典型且重要的概念:**计算机存储的是二进制位,类型决定了解释方式**。

假设你的 int  ...

为什么8位情况下补码-128 是 10000000
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 10:03 | 显示全部楼层
11063216906 发表于 2026-08-01 10:03
FishC 发表于 2026-8-1 09:49
这是一个非常典型且重 ...


8位二进制补码能表示的范围是 -128 到 127,而 -128 的补码确实是 10000000。这里面需要一点“特殊规则”。

补码设计原则是:正数的补码和原码相同,负数的补码是“对应正数取反再加1”。但 -128 没有对应的“+128”正数(因为8位有符号数最大只能到127),所以它只能靠特殊位置来承载。

你可以这样理解验证:

- 10000000 如果当作无符号数,就是 128。
- 但当作有符号补码时,最高位是符号位,1 表示负数。
- 补码转回真实值的方法:符号位不动,其余位按位取反再加1。  
  对于 10000000:符号位1,其余位取反得 1111111,再加1得 10000000,即128。  
  因此它代表 -128。

再换个角度:

- -127 的补码是 10000001。
- -128 的补码 10000000 再加上 1,正好变成 10000001,也就是 -127。
- 这说明 10000000 往前走一步就是 -127,所以它只能是 -128。

为什么不能是 -0?因为补码里 0 只有一种表示 00000000,不存在“负零”。这样省下来的编码就多表示了一个负数,所以8位补码的下限不是 -127,而是 -128。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-8-2 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表