我们都是可移植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位计算机...
Damian Conway经常将C++与C进行比较:
他当时描述的是其他软件工程师,而不是硬件工程师,但是意图还是很明确的,因为推理是相同的。
C和C++都是标准化的,要求您假定其他工程师都希望表现出色。您的Machiavellian计算机不会威胁到您的程序,因为它完全威胁到C/C++。
返回您的问题:
您确实有两个选择。
关于c++ - 使程序在 "machine byte"中具有不同位数的机器之间可移植,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14398902/