许多文本都警告说,将char值作为整数处理是不可移植的,例如,假设'A'的值为65(如ASCII中所示).
但是什么决定了这个字符集是ASCII(或扩展形式)还是其他一些字符集?它是由操作系统还是编译器决定的?我假设这不依赖于硬件.
例如,英特尔PC是否有一个字符集,如EBCDIC(理论上)?并且可以LANG在Linux/Unix中更改环境变量来更改C程序的基本字符集的值(如果再重新编译)?
(编辑:我现在看到Linux中的各种非拉丁字符集都有相同的基本ASCII码,例如KOI8-U - 我假设有些字符集与ASCII不兼容的变体)
该标准不关心任何这些细节,就它而言,只有“实现”。
实际上,硬件和操作系统都可以指定该平台上的 C 实现预期使用的实现细节,或者如果它们想要与系统功能互操作(也就是说,提供的代码),则需要使用这些实现细节与操作系统或硬件)。所以我们经常说“在 Win32 上sizeof(void*) == 4”之类的话。不过,这是一种简写,因为如果有人愿意,他们可以编写一个在 32 位 Windows 上运行并具有不同指针大小的 C 实现。我们真正的意思是,“在 Win32 ABI 中,sizeof(void*) == 4在 Win32 上运行的、不遵循 Win32 ABI 的 C 实现被排除在考虑范围之外”。
因此,实现可以为所欲为,只要它们不介意是否可以(例如)使用遵循系统约定的 dll。字符集可以根据编译器和标准库的编写者的喜好进行定义,仅受标准中的内容影响。
也就是说,字符文字的值是编译时常量。这告诉您基本执行字符集在运行时不能更改。
此外,如果它依赖于环境变量,那么有人有责任确保程序以与编译时相同的值运行。这对用户来说非常不友好,但该标准实际上并没有禁止某人编写对程序运行方式有特殊限制的 C 实现。