Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符常量的C编码_C_Encoding_Binary_Character - Fatal编程技术网

字符常量的C编码

字符常量的C编码,c,encoding,binary,character,C,Encoding,Binary,Character,我的程序员本能地认为c中的字符常量(例如:“x”)是使用编译它的机器上的机器字符集进行编码的。然而,以下练习来自“C编程语言:ANSI C版” 字符常量是用单引号括起来的一个或多个字符的序列,如“x”。只有一个字符的字符常量的值是执行时机器字符集中字符的数值 强调最后三个单词 有人能解释为什么他们会说“在执行时”。当然,字符值是在编译的二进制文件(或ELF,A.OUT…)中编码的 我想知道,但无法对此做出任何逻辑解释,当然K&R知道他们在做什么 您必须告诉编译器您将在哪个系统上运行程序。然后,它

我的程序员本能地认为c中的字符常量(例如:“x”)是使用编译它的机器上的机器字符集进行编码的。然而,以下练习来自“C编程语言:ANSI C版”

字符常量是用单引号括起来的一个或多个字符的序列,如“x”。只有一个字符的字符常量的值是执行时机器字符集中字符的数值

强调最后三个单词

有人能解释为什么他们会说“在执行时”。当然,字符值是在编译的二进制文件(或ELF,A.OUT…)中编码的


我想知道,但无法对此做出任何逻辑解释,当然K&R知道他们在做什么

您必须告诉编译器您将在哪个系统上运行程序。然后,它将为字符选择正确的编码


当然,默认情况是在与运行编译器的系统类似的系统上运行。在这种情况下,编译时和运行时字符集将是相同的。

C区分源字符集和执行字符集,因为您的编译器可能是交叉编译器,例如在移动平台的PC上。那么计算机上的字符集和目标机器上的字符集一定不一致。最简单的例子是EOL编码,这在当今市场上不同的通用平台之间是不同的。执行字符集还可能取决于运行程序的用户动态设置的“区域设置”和其他旋钮

您的问题似乎在于您将机器的字符集与使用的字符编码混淆了

阅读本文,了解字符集的实际含义。KnR(第二版)发行时的问题是电脑太多,有些是为当地政府和公众制造的。这导致两台计算机之间出现了不同的字符集,因此,美国机器上的“A”是俄罗斯机器上的西里尔字母(比如“Foo”)


因此无法信任字符常量。多亏了现在的现代计算机制造商,机器中的大多数字符集都是相同的,信息交换更简单

在C语言术语中,数据是针对特定语言环境编码的,语言环境声明字符集。程序有一个执行字符集。编译到程序中的文本(字符串和字符常量)将在该执行字符集中表示。程序本身可以将它从任何语言环境的字符集读取的文本转换为它自己的执行字符集,并根据任何语言环境的字符集格式化它生成的文本


“机器在执行时的字符集”的措辞很糟糕,它暗示了一些不存在或不真实的东西。

但这不能解释为什么他们会说“在执行时”。在我的解释中,这意味着它是动态设置的,这取决于目标计算机当前使用的是什么,好像它可能会以某种方式发生变化。这解释了为什么它没有说“在编译时”,因为您可以使用一台计算机为另一台计算机编译程序。例如,在移动应用程序中非常常见。@Boperson:我认为Max Snijders的意思是,他希望在编译时选择执行字符集,尽管可能与源字符集不同。但是他询问的文本提到了一个显然是在执行时选择的字符集。不,它并没有说字符值是在执行时选择的,它只是说编译器将使用适合目标系统的值。这是对原来的K&R的一个修订,K&R只是说“机器的字符集”。因此,必须将locale作为参数提供给编译器,以便它正确地将字符常量映射到数字常量。哈哈,“simpler”有点夸张。。。当使用不正确支持Unicode的语言时,Unicode是一个棘手的问题,如C或PHPc99及以上版本正确处理Unicode:-),wchar\u t现在正式成为该语言的一部分@马克斯尼德尔斯