gpt4 book ai didi

c - C 标准为带有十六进制转义序列的字符常量的值指定了什么?

转载 作者:行者123 更新时间:2023-12-04 14:39:05 25 4
gpt4 key购买 nike

C 2018 标准为 '\xFF' 等十六进制转义序列的值指定了什么?
考虑一个 C 实现,其中 char有符号和八位。
第 6.4.4.4 节告诉我们有关字符常量的信息。在第 6 段中,它讨论了十六进制转义序列:

The hexadecimal digits that follow the backslash and the letter x in a hexadecimal escape sequence are taken to be part of the construction of a single character for an integer character constant or of a single wide character for a wide character constant. The numerical value of the hexadecimal integer so formed specifies the value of the desired character or wide character.


十六进制整数是“FF”。按照通常的十六进制记法规则,它的值 1 是 255。请注意,到目前为止,我们还没有一个特定的类型:“字符”是“用于组织、控制或表示数据”(3.7)或“适合一个字节的位表示”(3.7.1)。当 \xFF用于 '\xFF' , 是文法中的 c-char (6.4.4.4 1),而 '\xFF'是一个整数字符常量。根据 6.4.4.4 2,“整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如 'x' 。”
6.4.4.4 9 规定了对字符常量的约束:

The value of an octal or hexadecimal escape sequence shall be in the range of representable values for the corresponding type:


接下来是一个表格,对于没有前缀的字符常量,显示对应的类型是 unsigned char .
到现在为止还挺好。我们的十六进制转义序列的值为 255,它在 unsigned char 的范围内。 .
那么 6.4.4.4 10 旨在告诉我们字符常量的值。我在这里引用它的句子分开并标记以供引用:

(i) An integer character constant has type int.

(ii) The value of an integer character constant containing a single character that maps to a single-byte execution character is the numerical value of the representation of the mapped character interpreted as an integer.

(iii) The value of an integer character constant containing more than one character (e.g., ’ab’ ), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined.

(iv) If an integer character constant contains a single character or escape sequence, its value is the one that results when an object with type char whose value is that of the single character or escape sequence is converted to type int.


如果 255 映射到执行字符,则 (ii) 适用,并且值 '\xFF'是那个字符的值。这是标准中第一次使用“ map ”;它没有在别处定义。除了从到目前为止派生的值 (255) 到具有相同值的执行字符的映射之外,它是否意味着其他任何东西?如果是这样,对于(ii)应用,必须有一个值为 255 的执行字符。那么值 '\xFF'将是 255。
否则 (iii) 适用,且值 '\xFF'是实现定义的。
无论 (ii) 或 (iii) 是否适用,(iv) 也适用。它表示 '\xFF' 的值是 char 的值值为 255 的对象,随后转换为 int .但是,由于 char有符号和八位,没有 char其值为 255 的对象。所以第四句陈述了不可能。
脚注
1 3.19 将“值”定义为“当解释为具有特定类型时对象内容的精确含义”,但我不认为这里使用了技术术语。 “十六进制整数的数值”还没有讨论的对象。这似乎是普通意义上的“值(value)”一词的用法。

最佳答案

您的演示得出了一个有趣的结论:

There is no portable way to write character constants with values outside the range 0 .. CHAR_MAX. This is not necessarily a problem for single characters as one can use integers in place of character constants, but there is no such alternative for string constants.


好像类型 char为了与许多标准 C 库函数保持一致,默认情况下应始终未签名:
  • fgetc()返回 int负值 EOF失败和 unsigned char 的值如果一个字节被成功读取。因此fgetc() == '\xFF'的意义和作用是实现定义的。
  • 来自 <ctype.h> 的函数接受 int参数与 fgetc() 返回的值相同.传递负值 char值具有未定义的行为。
  • strcmp()并根据转换为 unsigned char 的字符值比较字符串.
  • '\xFF'可能具有值 -1这是完全不直观的,可能与 EOF 的值相同。 .

  • 制作或保留的唯一理由 char默认情况下签名是与旧编译器兼容的历史代码,这些代码依赖于这种行为并且是在 signed char 出现之前编写的。 ,大约 30 年前!
    我强烈建议程序员使用 -funsigned-char制作 char默认情况下未签名并使用 signed char或更好 int8_t如果需要带符号的 8 位变量和结构成员。
    正如海德所评论的,为了避免可移植性问题, char值应转换为 (unsigned char) char的签名在哪里可能会带来问题:例如:
        char str[] = "Hello world\n";
    for (int i = 0; str[i]; i++)
    str[i] = tolower((unsigned char)str[i]);

    关于c - C 标准为带有十六进制转义序列的字符常量的值指定了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485088/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com