【问题标题】:What does \x mean in C/C++?\x 在 C/C++ 中是什么意思?
【发布时间】:2010-03-30 17:47:28
【问题描述】:

例子:

char arr[] = "\xeb\x2a";

顺便说一句,以下是一样的吗?

"\xeb\x2a"'\xeb\x2a'

【问题讨论】:

    标签: c syntax


    【解决方案1】:

    \x 表示十六进制字符转义。它用于指定不可输入的字符(如 null '\x00')。

    "\xeb\x2a" 是一个文字字符串(类型为char *,3 个字节,空终止),'\xeb\x2a' 是一个字符常量(类型为int,2 个字节,非空终止,并且只是另一种写入 0xEB2A 或 60202 或 0165452 的方式)。不一样:)

    【讨论】:

    • "type is char, 2 bytes" - 嗯,我认为这通常不适合 char
    • @Jefromi 确实如此,我想该类型更准确地描述为char[2]。已更新。
    • '\xeb\x2a'char[0]='\xeb',char[1]='\x2a'一样吗?
    • '\xeb\x2a' not 有一个 char[2] 类型 - 它是一个 int,其值由实现定义。
    • 那么'\xeb\x2a\xeb\x2a\xeb''\xeb\x2a\xeb' 呢?
    【解决方案2】:

    正如其他人所说,\x 是一个以“十六进制转义序列”开头的转义序列。

    来自 C99 标准的更多细节:

    当在一组单引号 (') 中使用时,这些字符是“整数字符常量”的一部分,即(6.4.4.4/2“字符常量”):

    用单引号括起来的一个或多个多字节字符序列,如'x'

    整数字符常量的类型为 int。包含映射到单字节执行字符的单个字符的整数字符常量的值是被解释为整数的映射字符表示的数值。包含多个字符(例如,'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。

    因此,'\xeb\x2a' 示例中的序列是实现定义的值。它可能是 int 值 0xeb2a0x2aeb,具体取决于目标平台是 big-endian 还是 little-endian,但您必须查看编译器的文档才能确定。

    当在一组双引号 (") 中使用时,由 hex-escape-sequence 指定的字符是以空字符结尾的字符串文字的一部分。

    来自 C99 标准 6.4.5/3“字符串文字”:

    同样的考虑适用于字符串文字或宽字符串文字中的序列的每个元素,就好像它在整数字符常量或宽字符常量中一样,除了单引号 ' 可以表示单独或由转义序列\' 表示,但双引号" 应由转义序列\" 表示。


    附加信息:

    在我看来,您应该避免使用“多字符”常量。只有在少数情况下,它们比使用常规的旧 int 常量提供任何价值。例如,'\xeb\x2a' 可以更便携地指定为 0xeb2a0x2aeb,具体取决于您真正想要的值。

    我发现多字符常量有些用处的一个领域是提出可以在调试器或内存转储中识别的巧妙枚举值:

    enum CommandId {
        CMD_ID_READ  = 'read',
        CMD_ID_WRITE = 'writ',
        CMD_ID_DEL   = 'del ',
        CMD_ID_FOO   = 'foo '
    };
    

    上面几乎没有可移植性问题(除了具有小整数的平台或可能会发出警告的平台)。无论字符最终以小端还是大端形式出现在枚举值中,代码仍然可以工作(除非您对枚举值做一些其他不圣洁的事情)。如果字符最终在值中使用的字节序不是您所期望的,这可能会使值在调试器中不易读取,但“正确性”不受影响。

    【讨论】:

    • '\xeb\x2a'char[0]='\xeb',char[1]='\x2a'一样吗?
    • 不,正如答案所述,'\xeb\x2a' 是具有实现定义值的int。该值几乎可以肯定是 0xeb2a 或 0x2aeb;哪一个几乎肯定取决于平台的字节序。我想如果某些编译器决定进行符号扩展,他们可能会将'\xeb\x2a' 转换为 0xffffeb2a。我不知道这种可能性有多大。
    • 我还想指出,在 C++ 中,'\x50' 的类型是 char,而不是 int,这与 C 不同。
    【解决方案3】:

    当你说:

    顺便说一句,这些是一样的吗:

    "\xeb\x2a" 与 '\xeb\x2a'

    事实上并非如此。第一个创建一个字符串文字,以零字节结尾,包含您提供的十六进制表示的两个字符。第二个创建一个整数常量。

    【讨论】:

    • 你能详细说明一下'\xeb\x2a'吗?
    • '\xeb' 是单个字符(=一个字节)所以 '\xeb\x2a' 是两个字节 = 16bit = short int
    • @Martin Beckett:不,包含多个字符的字符常量仍然是int,而不是short int。它的值是实现定义的。
    • @user198729 查尔斯说了什么。在 C 中,单引号之间的任何内容都将转换为整数。所以在 ASCII 中,'A' 被转换为 65。如果你说 'AB',那么它可能会被转换为 (65
    • @Charles Bailey - 抱歉,我想说两位数 \x 是一个字节,因此其中两个是 16 位值(即短整数)。但是在 C 中是的,即使只是“0”也是一个“整数”。
    【解决方案4】:

    这是一个特殊字符,表示字符串实际上是一个十六进制数。

    http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm

    【讨论】:

    • 最好在这里实际提供完整的答案,而不是将 OP 链接到他们可以找到它的地方——而且该链接除了“十六进制转义字符”之外没有任何解释。
    【解决方案5】:

    \x 表示它是一个十六进制字符转义。所以\xeb 表示十六进制字符eb,或十进制235。矿石信息见http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx

    至于第二个,不,它们不一样。双引号 " 表示它是一个字符串,一个以 null 结尾的字符数组,而单引号 ' 表示它是一个字符,即字符所代表的字节。

    【讨论】:

    • 单引号表达式不是单字节字符。
    【解决方案6】:

    \x 允许您通过其十六进制代码指定字符。

    这允许您指定通常不可打印的字符(其中一些具有预定义的特殊转义序列,例如 '\n'=newline 和 '\t'=tab '\b'=bell)

    【讨论】:

      【解决方案7】:

      一个有用的网站是here

      我引用:

      x 无符号十六进制整数

      这样,您的\xeb 就像十进制的 235。

      【讨论】:

      • 该链接是对 printf() 等所使用的格式字符串的描述,而不是 C 文字所理解的转义序列。它也是 C++ 特定的,但由于 OP 询问的是神话语言 C/C++,我就让它过去吧。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2013-03-09
      • 2017-01-17
      相关资源
      最近更新 更多