【问题标题】:Why 255 is the limit为什么 255 是限制
【发布时间】:2024-01-19 01:06:02
【问题描述】:

我看过很多地方说:

最大字符数为 255。

其中字符是 ASCII。这样做有技术原因吗?

编辑: 我知道 ASCII 由 8 位表示,因此有 256 个不同的字符。问题是他们为什么指定最大字符数(有重复)是 255。

【问题讨论】:

  • 请记住,没有一种字符集称为“扩展 ASCII”。准确说出是哪一个(例如 CP437 和 Windows-1252)非常重要。
  • 不确定该声明来自何处,但可能与将 0 视为字符串终止符的 C 语言有关。
  • 无论答案如何,上面关于 255 个 ASCII 字符的说法都是错误的。它忘记了值 00h 的八位字节,它使用扩展的 ASCII 集,并忘记了 ASCII 字符集中的空洞(未映射的字节)。这种 cmets 通常放在人们不理解字节、文本和以 null 结尾的 char* 值之间的区别的地方。如果您发现类似这样的语句并期待任何事情(尤其是错误和缓冲区溢出),请谨慎操作。

标签: character-encoding char ascii


【解决方案1】:

我假设您所指的限制是 ASCII 字符串的长度。

限制的出现是由于一种优化技术,其中较小的字符串存储在第一个字节保存字符串的长度。由于一个字节只能保存 256 个不同的值,因此最大字符串长度为 255,因为第一个字节被保留用于存储长度。

一些较旧的database systemsprogramming languages 因此对其本机字符串类型有此限制。

【讨论】:

  • 我认为问题是指字符串,而不是字符,这是最好的答案。我注意到在某些数据库中,某些文本数据类型的默认字符串限制为 255 个字符。
【解决方案2】:

扩展 ASCII 是一个 8 位字符集。 (原始 ASCII 是 7 位的,但这里不相关。)

8位表示可以引用2^8个不同的字符。

2^8 等于 256,由于计数以0 开头,因此最大 ASCII 字符代码的值为 255。

因此,声明:

最大字符数为 255。

错了,应该是:

最大字符数为 256,最大可能字符代码为 255。

要更好地了解字符如何映射到从 0 到 255 的数字,请参阅the 8-bit ASCII table

【讨论】:

  • 您链接的页面的介绍性文本说它不是 ASCII。另请注意,该表列出的字符少于 256 个。
  • @TomBlodget:嗯?当然是 ASCII,写满了页面。您在哪里看到它不是 ASCII 的注释?而且,正如我所说,有 256 (0 - 255) 个符号。
  • “根据 ISO 8859-1 和 Microsoft® Windows Latin-1,您将在此网页上找到 8 位、256 个字符。”所以它是许多"Extended ASCII" 字符集之一。在处理字符集和编码时,必须通过名称或引用线程/进程/用户/操作系统默认值来说明是哪一个。它看起来像Windows-1252。我没有检查整张桌子,但我确实检查了 81、8D、8F、90、9D 处的孔。
  • @TomBlodget:好的,我明白你的意思。 :) 我的回答确实过于简单化了,但我认为回答最初的问题就足够了。不过,感谢您的注释。
【解决方案3】:

限制为 255,因为 9+36+84+126 = 255。第 256 个字符(实际上是第一个字符)为零。

使用组合公式 Ck(n) = n/k = n!/(k!(nk)!) 求 1,2,3,4,5,6,7 的非重复组合数,8 位数你得到这个:

位数:1 2 3 4 5 6 7 8

组合数:9 36 84 126 126 84 36 9

没有必要包含 5-8 位,因为它是 M 的对称群。换句话说,一个 4 元素生成器是一个八位字节的群操作,它的群操作有 255 个排列。

有趣的是,它只需要 3 位数字就可以“数”到 1000(789 之后的其余数字是之前组合的重复)。

【讨论】:

    【解决方案4】:

    这有技术原因吗?

    是的,有。早期的 ASCII 编码标准是 7 位对数,可以表示 2^7 = 128 (0 .. 127) 种不同的字符编码。

    这里说的是后来开发的ASCII编码的变种,是8位对数,可以容纳2^8 = 256(0..255)个字符码。

    有关更多信息,请参阅Wikipedia

    【讨论】:

      【解决方案5】:

      计数从 0 开始,到 255 结束,这意味着从 1 到 255 有 255 个计数,包含 0 后变为 256。

      打印全部 256 个字符的程序

      #include<stdio.h>
      
      int main() {
        for (int i = 0; i <= 255; i++) {
          printf("%d = %c\n", i, i);
        }
        return 0;
      }
      

      【讨论】:

        【解决方案6】:

        ASCII 表中的字符总数为 256(0 到 255)。 0 到 31(共 32 个字符)称为 ASCII 控制字符(字符代码 0-31)。 32 到 127 个字符称为 ASCII 可打印字符(字符代码 32-127)。 128到255被称为扩展ASCII码(字符码128-255)。

        The ASCII value of a-z  =  97-122
        The ASCII value of A-Z  =  65-90
        The ASCII value of 0-9  =  48-57
        

        【讨论】: