我们都是便携式C/C++程序的粉丝.
我们知道sizeof(char)或sizeof(unsigned char)总是1"字节".但是1"字节"并不意味着具有8位的字节.它只是一个"机器字节",其中的位数可能因机器而异.看到这个问题.
假设您将ASCII字母"A"写入文件中foo.txt.这些天,在任何普通机器上都有一个8位机器字节,这些位将被写出来:
01000001
Run Code Online (Sandbox Code Playgroud)
但是如果要在具有9位机器字节的机器上运行相同的代码,我想这些位将被写出来:
001000001
Run Code Online (Sandbox Code Playgroud)
更重要的是,后一台机器可以将这9位写为一个机器字节:
100000000
Run Code Online (Sandbox Code Playgroud)
但是如果我们要在前一台机器上读取这些数据,我们就无法正常工作,因为没有足够的空间.不知何故,我们必须首先读取一个机器字节(8位),然后以某种方式将最后的1位变换为8位(机器字节).
程序员如何正确地协调这些事情?
我问的原因是我有一个编写和读取文件的程序,我想确保它不会在5年,10年,50年后中断.
程序员如何正确地协调这些事情?
什么都不做.你提出了一个文件系统问题.
想象一下,当许多9位机器中的第一台启动时,可以重新编译代码并处理A去年写入文件的ASCII字母的可怕日子.
为了确保该机器可以合理地存在C/C++编译器,这台新计算机的操作系统遵循C和C++假设的相同标准,其中文件的大小以字节为单位.
...您的8位源代码已经存在一些问题.每个源文件只有大约1/9的机会,这个大小甚至可以存在于这个系统上.
或者可能不是.就像我经常遇到的情况一样,Johannes Schaub - litb已经先发制人地引用了有关C++源代码有效格式的标准.
如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).Trigraph序列(2.3)由相应的单字符内部表示代替.不在基本源字符集(2.2)中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即使用\ uXXXX表示法),等效).
"以实现定义的方式." 这是个好消息......只要有一些方法可以将您的源代码转换为可在此机器上表示的任何1:1格式,您就可以编译它并运行您的程序.
所以这就是你真正的问题所在.如果这台计算机的创建者非常友好地提供了一个实用程序来扩展8位ASCII文件,以便它们可能实际存储在这台新机器上,那么A很久以前你写的ASCII字母已经没问题了.如果没有这样的实用程序,那么你的程序已经需要维护,你无法做任何事情来阻止它.
编辑:较短的答案(解决已被删除的评论)
问题是如何处理特定的 9位计算机......
Damian Conway有一个经常重复的引用,比较C++和C:
"C++试图防范墨菲,而不是马基雅维利."
他正在描述其他软件工程师,而不是硬件工程师,但目的仍然是合理的,因为推理是相同的.
C和C++都是标准化的,需要你假定其他工程师想要玩得很好.您的Machiavellian计算机不会对您的程序构成威胁,因为它完全是对C/C++的威胁.
回到你的问题:
程序员如何正确地协调这些事情?
你真的有两个选择.
| 归档时间: |
|
| 查看次数: |
827 次 |
| 最近记录: |