我们都是可移植C/C++程序的爱好者。

我们知道sizeof(char)sizeof(unsigned char)始终是1“字节”。但是那个1“字节”并不意味着一个8位的字节。它仅表示一个“机器字节”,并且其中的位数可能因机器而异。参见this question

假设您将ASCII字母'A'写出到文件foo.txt中。如今,在任何具有8位机器字节的普通机器上,这些位都将被写出:

01000001

但是,如果您要在具有9位机器字节的机器上运行相同的代码,我想这些位将被写出:
001000001

更重要的是,后一台机器可以将这9位写为一个机器字节:
100000000

但是,如果我们要在前一台计算机上读取此数据,则由于空间不足,我们将无法正确执行此操作。以某种方式,我们必须先读取一个机器字节(8位),然后以某种方式将最后的1位转换为8位(机器字节)。

程序员如何正确调和这些东西?

我问的原因是我有一个可读写文件的程序,并且我想确保它从现在起不会中断5、10、50年。

最佳答案



无所事事。您提出了文件系统问题。

想象一下那可怕的一天,当许多9位计算机中的第一个启动时,准备重新编译代码并处理您去年写入文件的ASCII字母A

为了确保该计算机可以合理地使用C/C++编译器,这台新计算机的OS遵循C和C++假定的相同标准,其中文件的大小以字节为单位。

...您的8位源代码已经存在一些问题。每个源文件只有一个十分之一的机会出现在该系统上,甚至可以存在。

或者可能不是。对于我来说,Johannes Schaub - litb通常是cited the standard regarding valid formats for C++ source code



“以实现定义的方式。”这是个好消息……只要有某种方法可以将源代码转换为可以在此计算机上表示的任何1:1格式,就可以对其进行编译并运行程序。

因此,这就是您真正的问题所在。如果这台计算机的创建者足够友好,可以提供对8位ASCII文件进行位扩展的实用程序,以便它们实际上可以存储在此新计算机上,那么您很久以前编写的ASCII字母A就已经没有问题了。而且,如果没有这样的实用程序,则您的程序已经需要维护,并且您无法做任何事情来阻止它。

编辑:较短的答案(解决此后已删除的评论)

问题询问如何处理特定于 9位计算机...

  • 使用没有向后兼容的8位指令的硬件
  • 使用不使用“8位文件”的操作系统。
  • 使用C/C++编译器可以打破C/C++程序历史记录上写入文本文件的方式。

  • Damian Conway经常将C++与C进行比较:



    他当时描述的是其他软件工程师,而不是硬件工程师,但是意图还是很明确的,因为推理是相同的。

    C和C++都是标准化的,要求您假定其他工程师都希望表现出色。您的Machiavellian计算机不会威胁到您的程序,因为它完全威胁到C/C++。

    返回您的问题:



    您确实有两个选择。
  • 接受您所描述的计算机不适用于C/C++
  • 接受C/C++不适用于您描述
  • 的计算机上可能运行的程序

    关于c++ - 使程序在 "machine byte"中具有不同位数的机器之间可移植,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14398902/

    10-13 09:52