鱼C论坛

 找回密码
 立即注册
楼主: 11063216906

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

[复制链接]
 楼主| 发表于 2026-8-9 20:37:58 | 显示全部楼层
FishC 发表于 2026-8-9 19:49
1111 1101 按补码解释,十进制是 **-3**。

计算方法(权重法):
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int a = 1, b = 2;

  5.         a = 0 && 1 = b;

  6.         return 0;
  7. }
复制代码

为啥会报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-9 20:38:12 | 显示全部楼层
11063216906 发表于 2026-08-09 20:37
FishC 发表于 2026-8-9 19:49
1111 1101 按补码解释 ...


这是因为C语言的**运算符优先级**导致的。

0 && 1 = b 中,逻辑与 && 的优先级**高于**赋值运算符 =,所以编译器会把它解析为:

  1. (0 && 1) = b
复制代码


(0 && 1) 是一个表达式的结果(值为0),**不是可修改的左值**,不能放在赋值符号左边。因此编译器报错。

即使你加括号写成 0 && (1 = b)1 = b 也是非法的,因为 1 是常量,同样不是左值。

简单记:赋值运算符左边一定要是变量,不能是表达式结果或常量。

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

使用道具 举报

 楼主| 发表于 2026-8-10 22:20:45 | 显示全部楼层
FishC 发表于 2026-6-20 11:20
确实不是这样。让我用通俗的方式帮你理清浮点数的实际存储机制。

首先,float 类型在内存中占用固定的32 ...
  1. while ((ch = getchar()) == ' ')
  2.         ;
复制代码


如果用这种方式相当于略去了空格
那我在后面再次调用getchar的时候是直接获得空格之后的内容吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-10 22:20:54 | 显示全部楼层
11063216906 发表于 2026-08-10 22:20
FishC 发表于 2026-6-20 11:20
确实不是这样。让我用 ...


不是的。这个循环退出时,已经读取了一个**非空格字符**,并且这个字符保存在 `ch` 中。如果你后面再次调用 `getchar()`,它会读取**这个非空格字符之后的下一个字符**,而不是返回当前这个非空格字符。

例如输入 `"  A B"`:
- 第一次 `getchar()` 读到空格,循环继续
- 第二次读到空格,循环继续
- 第三次读到 `'A'`,不是空格,循环退出
- 此时 `ch` 等于 `'A'`
- 如果你再调用 `getchar()`,得到的是 `' '`(空格),而不是 `'A'`

如果你希望后面直接使用这个非空格字符,应该使用 `ch` 变量,而不是再次 `getchar()`。

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

使用道具 举报

 楼主| 发表于 2026-8-14 21:54:19 | 显示全部楼层
FishC 发表于 2026-8-10 22:20
不是的。这个循环退出时,已经读取了一个**非空格字符**,并且这个字符保存在 `ch` 中。如果你后面再次 ...

what's EOF
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-14 21:54:27 | 显示全部楼层
11063216906 发表于 2026-08-14 21:54
FishC 发表于 2026-8-10 22:20
不是的。这个循环退出 ...


EOF 是 End Of File(文件结束)的缩写,在 C 语言中它代表“输入结束”或“读取失败”的标志。  

它通常被定义为 **-1**,在 stdio.h 头文件中声明。  

getchar() 返回类型是 int,当它读到文件末尾或遇到错误时,就会返回 EOF。比如从键盘输入时,在 Windows 下按 Ctrl+Z 再回车,在 Linux/Mac 下按 Ctrl+D,getchar() 就会返回 EOF。  

常见用法:  

  1.   
  2. int ch;  
  3. while ((ch = getchar()) != EOF) {  
  4.     // 循环读取字符,直到输入结束  
  5. }  
复制代码


注意:必须用 int 类型保存 getchar() 的返回值,不能用 char。因为 char 可能无法正确表示 EOF(即 -1),导致判断失效。

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

使用道具 举报

 楼主| 发表于 2026-8-25 21:31:04 | 显示全部楼层
FishC 发表于 2026-6-20 12:48
在32位系统中,存储十进制下的整数 1 确实是用 32个二进制位组成一组 来表示的。具体来说:

- 对于  ...

我想问下CPU的register应该怎么翻译 这个是什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-25 21:31:12 | 显示全部楼层
11063216906 发表于 2026-08-25 21:31
FishC 发表于 2026-6-20 12:48
在32位系统中,存储十 ...


在计算机领域,CPU 的 register 通常翻译为“寄存器”。它是一个位于 CPU 内部的极小容量、极高速的存储单元,用来暂时存放指令、数据或内存地址。CPU 执行运算时,会先把数据从内存搬到寄存器,处理完后再写回内存。寄存器是计算机中最快的存储介质,但数量很有限。简单说,寄存器就是 CPU 自己的“临时工作台”。

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

使用道具 举报

 楼主| 发表于 2026-8-25 21:36:31 | 显示全部楼层
FishC 发表于 2026-8-25 21:31
在计算机领域,CPU 的 register 通常翻译为“寄存器”。它是一个位于 CPU 内部的极小容量、极高速的存 ...

CPU has a limited repertoire of instructions(known as the instruction set)that it understands
这句话怎么理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-25 21:36:35 | 显示全部楼层
11063216906 发表于 2026-08-25 21:36
FishC 发表于 2026-8-25 21:31
在计算机领域,CPU 的 ...


这句话的意思是:**CPU 只能理解一组数量有限的指令,这组指令统称为“指令集”**。

可以这样理解:
- CPU 不是万能的,它只认特定的“操作码”,比如加法、减法、读写内存等。
- 这些指令的集合就是 instruction set(指令集)。
- 每种 CPU 型号都有自己固定的指令集,就像它只懂这一套“语言”。
- 你写的 C 代码最终会被编译成这些指令,CPU 才能执行。

所以“limited repertoire”强调的是 CPU 的指令种类是有限的、固定的,不会无限增加。

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

使用道具 举报

 楼主| 发表于 2026-8-25 21:51:05 | 显示全部楼层
FishC 发表于 2026-8-25 21:36
这句话的意思是:**CPU 只能理解一组数量有限的指令,这组指令统称为“指令集”**。

可以这样理解: ...

解释
The compiler approach has another benefit. In general, each computer design has its own
unique machine language; so a program written in the machine language for, say, an Intel Core
i7 CPU means nothing to an ARM Cortex-A57 CPU. But you can match a compiler to a particu-
lar machine language. Therefore, with the right compiler or set of compilers, you can convert
the same high-level language program to a variety of different machine-language programs.
You solve a programming problem once, and then you let your compilers translate the solution
to a variety of machine languages.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-25 21:51:09 | 显示全部楼层
11063216906 发表于 2026-08-25 21:51
FishC 发表于 2026-8-25 21:36
这句话的意思是:**CP ...


这段文字在讲编译器的一个关键好处:**不同CPU的机器语言不通用,但编译器可以“翻译”**。

英特尔 Core i7 的机器语言,ARM 的 CPU 根本看不懂。但只要你给每种CPU配一个对应的编译器,用同一份C语言源代码,就能分别编译出各自能运行的机器码。

也就是说:你只需要写一次程序,剩下的翻译工作交给不同的编译器即可。这就是“一次编写,到处编译”的思想。

简单记:编译器是“翻译官”,能把同一份高级语言源码翻译成多种CPU各自能懂的机器语言。

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

使用道具 举报

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

我用cc命令编译c语言
那调用的是clang编译器还是gcc呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-30 21:59:35 | 显示全部楼层
11063216906 发表于 2026-08-30 21:59
FishC 发表于 2026-7-11 21:48
第一个 printf("%s",  ...


在大多数Linux系统中,`cc` 通常是一个符号链接,指向系统默认的C编译器。在常见的Linux发行版(如Ubuntu、Debian)上,它一般指向 `gcc`。而在macOS上,`cc` 通常指向 `clang`。

如果你想确认当前系统的 `cc` 到底调用的是哪个编译器,可以执行:

  1. cc --version
复制代码


这会显示编译器名称和版本信息,一目了然。另外也可以使用 ls -l /usr/bin/cc 查看它指向的具体程序。所以没有固定答案,取决于你的系统环境。

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

使用道具 举报

 楼主| 发表于 2026-9-1 21:02:20 | 显示全部楼层
FishC 发表于 2026-8-25 21:51
这段文字在讲编译器的一个关键好处:**不同CPU的机器语言不通用,但编译器可以“翻译”**。

英特尔  ...

This line reads a keystroke, so the program will pause until you press the Enter key. Sometimes,
depending on how the program functions, there might already be a keystroke waiting. In that
case, you’ll have to use getchar() twice:
getchar();
getchar();
For example, if the last thing the program did was ask you to enter your weight, you would
have typed your weight and then pressed the Enter key to enter the data. The program would
read the weight, the first getchar() would read the Enter key, and the second getchar()
would cause the program to pause until you press Enter again. If this doesn’t make a lot of
sense to you now, it will after you learn more about C input. And we’ll remind you later about
this approach.
给我解释一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-9-1 21:02:27 | 显示全部楼层
11063216906 发表于 2026-09-01 21:02
FishC 发表于 2026-8-25 21:51
这段文字在讲编译器的 ...


这段话讲的是 `getchar()` 的一个常见“坑”:**回车键留下的换行符**。

普通终端输入是“行缓冲”的:你按下 Enter 后,系统才会把这一整行(包括换行符 `\n`)交给程序。`getchar()` 一次读取一个字符。

假设程序之前用 `scanf("%d", &weight)` 读取你的体重:

你输入 `70` 然后按 Enter,输入缓冲区里其实是 `70\n`。
`scanf` 读取数字 `70` 后,**把 `\n` 留在了缓冲区里**。

此时第一个 `getchar()` 会立刻读走那个残留的 `\n`,根本不会等待你按任何键。
第二个 `getchar()` 才会真正停下来,等待你输入新的内容并按下 Enter。

所以作者说“可能要调用两次 `getchar()`”:
- 第一次:清掉残留的回车
- 第二次:真正暂停屏幕,等待你按 Enter

这也解释了为什么很多程序在结尾会写:

  1. getchar();
  2. getchar();
复制代码


作用就是:第一个吃掉上次输入遗留的换行符,第二个才让程序暂停住,让你看到运行结果。

等你以后学到更完整的输入处理方式,就会明白这种临时“清缓冲”的技巧了。

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

使用道具 举报

 楼主| 发表于 2026-9-1 21:11:29 | 显示全部楼层
FishC 发表于 2026-9-1 21:02
这段话讲的是 `getchar()` 的一个常见“坑”:**回车键留下的换行符**。

普通终端输入是“行缓冲” ...

我没懂 第一个getchar不会读取内容吗 直到第二个getchar才开始读取?
那清除\n怎么做到的 这个是指的本次输入之前残留的\n吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-9-1 21:11:37 | 显示全部楼层
11063216906 发表于 2026-09-01 21:11
FishC 发表于 2026-9-1 21:02
这段话讲的是 `getchar ...


第一个 `getchar()` 当然会读取内容,它和第二个一样,都会阻塞等待输入。关键在于“缓冲区里已经有什么”。

程序运行时的输入是“行缓冲”的:你输入 `70` 并回车,缓冲区里其实是 `70\n`。`scanf` 读取数字 70 后,会把 `\n` 留在缓冲区里。此时第一个 `getchar()` 被调用,它发现缓冲区里已经有一个 `\n` 在等待,于是**立即**读走它,根本不会暂停。第二个 `getchar()` 再调用时,缓冲区空了,它才会真正停下来等你按回车。

所以:
- 第一个 `getchar()` 读取的是**上一次输入残留的 `\n`**(也就是本次输入之前的遗留物)。
- 第二个 `getchar()` 读取的是**你接下来新输入的字符**(通常就是回车键)。

两个 `getchar()` 都在读取,只是第一个读的是“旧货”,第二个才开始读“新货”。这样程序就能实现“按回车继续”的效果。

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

使用道具 举报

 楼主| 发表于 2026-9-1 21:14:33 | 显示全部楼层
FishC 发表于 2026-9-1 21:11
第一个 `getchar()` 当然会读取内容,它和第二个一样,都会阻塞等待输入。关键在于“缓冲区里已经有什 ...

scanf和getchar是如何搭配使用的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-9-1 21:14:41 | 显示全部楼层
11063216906 发表于 2026-09-01 21:14
FishC 发表于 2026-9-1 21:11
第一个 `getchar()` 当 ...


scanf 和 getchar 搭配使用,最常见的目的就是**清理输入缓冲区中残留的换行符**。

先看典型问题:  
scanf("%d", &num);  
然后紧接着用 getchar() 想读取一个字符,结果发现 getchar() 根本没有等待,而是直接读到了一个换行符。

为什么?  
因为你输入数字后按了回车,缓冲区里是 “数字 + \n”。scanf 只取走了数字,把 \n 留在了缓冲区里。随后 getchar() 立刻读走了这个 \n。

解决办法有两种:

方式一:用 getchar() 吃掉多余的换行符  
scanf("%d", &num);  
getchar();   // 吃掉残留的 \n  
char ch = getchar(); // 此时才真正等待你输入字符

方式二:在 scanf 的格式字符串中加一个空格,让 scanf 自动跳过空白字符(包括换行符)  
scanf("%d ", &num);  // 注意 %d 后面的空格  
char ch = getchar(); // 直接读取字符,不会读到残留的 \n

还可以用循环清空缓冲区直到遇到换行:  
while (getchar() != '\n');  // 清掉缓冲区内所有残留字符

简单记:scanf 负责读“数据”,getchar 负责清“垃圾”。搭配使用时,先用 getchar 清掉回车,再读取你真正需要的字符。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 22:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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