数字只是数字吗?

Are digits only numbers?

提问人:user22869055 提问时间:11/7/2023 最后编辑:Jonathan Leffleruser22869055 更新时间:11/7/2023 访问量:144

问:

根据我的研究,数字是一个数字字符。但我不确定它是否也可以是一个问号、一个逗号,甚至是一个点。有人可以确认我是否正确吗?

c 计算机科学 数字

评论

0赞 Bob__ 11/7/2023
这:en.cppreference.com/w/c/string/byte/isdigit 可能会有所帮助。
0赞 Simon Goater 11/7/2023
base64 使用非字母数字的“数字”。

答:

-2赞 2 revschux - Reinstate Monica #1

数字只是数字吗?

不。

"INF",可解析为浮点值。"NaN"

"0xABC"可以解析为整数。这里,是一个数字,一个十六进制数字。'A'

数字,如 、 、 ....可以解析为字符串,而不仅仅是数字。"0""12345"

单个十进制数字字符具有读取和解释它们的各种可能性。'0''9'

评论

0赞 Gyro Gearloose 11/7/2023
“INF”和“NaN”(明确地:“N ot a Number”)是数字吗?
0赞 bazza 11/7/2023
@GyroGearloose INF 当然是,但打印出来需要相当长的时间......
1赞 Gyro Gearloose 11/7/2023
@bazza从数学的角度来看,“INF”是一个极限情况,被明确排除为数字。充其量,它只是一个折磨数字,指的是aleph_1。
0赞 bazza 11/7/2023
@GyroGearloose,我知道,我太傻了。打印出“aleph 1”需要更少的纸张/墨水,但 500 张 '9 感觉更令人印象深刻。
0赞 Eric Postpischil 11/7/2023
或是否可解析为浮点值与数字是否为数字无关。这个问题不问数字或仅由数字组成的字符串是否是唯一的数字。它询问数字(表示数字字符)是否只是 、 、 、 、 中的一个,而不是任何其他字符,例如 a 或 a 或 a(可能出现在数字中)。INFNaN0123456789+,.
0赞 Gyro Gearloose 11/7/2023 #2

嗯,“1”是一个数字,也是一个数字。“12”不是一个数字,而是一个数字。

数字由数字和附加字符组成,例如小数点,或符号(加/减),或小数点分隔符,后期使用只是为了使大数字更具可读性。

0赞 Caleb 11/7/2023 #3

数字正是可用于书写数字的数字字符集,即如果您谈论的是以 10 为基数的集合;十进制数字集加上十六进制数字(如果您谈论的是十六进制数字);如果你在谈论二进制数等,则为集合。其他字符(小数点、千位分隔符、负号、运算符、标点符号、方括号/括号等)都不是数字。{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}{A, B, C, D, E, F}{0, 1}

另一种看待它的方法是,数字正是可用于指示任何基数中数字中单个位置值的字符。

0赞 bazza 11/7/2023 #4

简单回答

表面的答案是Bob___提到的,用于确定 C 编程语言是否将字符计为数字的函数。这对于绝大多数用途来说已经足够了。isdigit()

更复杂的答案

更复杂的是,当人们问一个更基本的问题时,“什么是角色”?

如今,我们非常习惯于 1 字节的数据表示 ASCII 字符表中的字符,但在 C 语言中,不确定情况是否如此。当C语言刚被创建时,有许多相互竞争的字符表,例如IBM的EBCDIC。如今,UTF 有各种风格,UTF8 与 ASCII 表中的 127 个字符二进制兼容。

无论如何,所有这些字节值实际上所做的就是告诉一些图形引擎/终端显示器或电传打印机选择什么字符字形或高尔夫球位置来绘制/锤击到页面上。特定字节值是否为数字仅由人们假设的字符表定义,该字符表首先适用于数据。

因此,如果您从源自使用 EBCDIC 的古老 IBM 大型机的文件中读取一个字节,那么现代 Linux C 编译器的版本将为您提供错误的答案,因为它期望输入是针对 ASCII 字符集的。同样,如果你将你的 Linux 连接到一个期望获得 EBCDIC 字符的终端,你最终会得到一个非常混乱的显示。同样,如果您将 UTF-16 数据流馈送到无法理解它的终端显示器,也是如此。isdigit()

而且,这是在人们开始考虑数字有多少种不同符号之前。大多数人对数字的期望是字符 0,1,2,3,4,5,6,7,8,9。更丰富的表示法会输入 +、- 和 。或 ,表示小数位。科学记数法可能会输入“e”或“E”。如果是 base16,则输入 A、B、C、D、E、F 是司空见惯的。

因此,对“数字字符”的含义有许多不同的可能解释。

[顺便说一句,我最近读到艾伦·图灵(Alan Turing)擅长以17为基数的心算——这与当天的密码破译有关。有人知道他们是如何记下 17 基数的吗?我有一种感觉,十六进制的 A-F 非常现代]。

这只是一种冗长的说法,由您来选择您想要遵循的惯例。使用标准库函数 like 意味着使用编译器/库开发人员选择采用的约定进行操作,这是一种能够简短地向其他人解释您遵循的约定的好方法,并且很容易与其他代码互操作。您可能希望选择其他易于理解的约定(例如 0..9,A..F 表示十六进制)。或者,如果你真的想,发明你自己的!isdigit(), printf(), atoi(), atof()

-1赞 Eric Postpischil 11/7/2023 #5

根据我的研究,数字是一个数字字符。但我不确定它是否也可以是一个问号,一个昏迷,甚至一个点。

根据 C 2018 5.2.1 3,10 位十进制数字是 、 、 、 、 和 (仅此而已)。0123456789

根据 C 2018 6.4.2.1 1,C 语法中的数字标记是 、 、 、 、 或之一(不是其他任何内容)。0123456789

根据 C 2018 7.4.1.4 2,该函数测试 5.2.1 中定义的任何十进制数字字符。isdigit

在某些情况下,我们可能会接受其他字符作为数字。十六进制数字包括 、 、 、 、 和小写版本。但是像这样的扩展应该明确说明或从上下文中清楚说明。普通的十进制数字只是通过 的十个字符之一。ABCDEF09

补充

数字只是数字吗?

当我们谈论数字、字符串和数字时,我发现区分数字和数字很有帮助:

  • 数字是一个数学实体。17、2/3、π 和 -1 是数字。虚数和复数,例如 3+4i,通常被认为是数字。∞,无穷大可以被认为是一个数字。(抽象数学可能把其他实体当作数字。“十七”、“17”、“11 16”和“1.7•10 1”是同一数字的不同名称。
  • 数字是表示数字的一串字符(也可能是其他形式的书写)。“123”是一串数字字符,代表数字一百二十三。 也是 123 的数字,也是 .0x7B12.3e1

鉴于此,十进制数字不是数字。它是一个字符,它可以单独使用,也可以与其他数字一起使用。它也可以是带有其他字符的数字的一部分,例如 in 。.3.4