char arr[]= "\xeb\x2a";
顺便说一下,这些都是一样的:
"\xeb\x2a" VS '\xeb\x2a'
Set*_*eth 32
\x表示十六进制字符转义.它用于指定不可键入的字符(如null '\x00').
并且"\xeb\x2a"是一个文字字符串(类型是char *,3个字节,以空值终止),并且'\xeb\x2a'是一个字符常量(类型是int,2个字节,不是空终止的,并且只是写入0xEB2A或60202或0165452的另一种方式).不一样 :)
Mic*_*urr 10
正如其他人所说,这\x是一个启动"十六进制 - 逃逸 - 序列"的转义序列.
C99标准的一些进一步细节:
当在一组单引号(')中使用时,字符是"整数字符常量"的一部分,即(6.4.4.4/2"字符常量"):
用单引号括起来的一个或多个多字节字符的序列,如
'x'.
和
整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.包含多个字符(例如
'ab')的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的.
因此,您的示例中的序列'\xeb\x2a'是实现定义的值.它可能是int值0xeb2a或0x2aeb取决于目标平台是big-endian还是little-endian,但你必须查看编译器的文档才能确定.
在一组双引号(")中使用时,hex-escape-sequence指定的字符是以null结尾的字符串文字的一部分.
从C99标准6.4.5/3"字符串文字":
相同的注意事项适用于字符串文字或宽字符串文字中序列的每个元素,就好像它是整数字符常量或宽字符常量一样,除了单引号
'可以单独表示或通过转义表示序列\',但双引号"应由转义序列表示\".
附加信息:
在我看来,你应该避免使用'多字符'常量.只有少数情况下它们使用常规的旧int常数提供任何值.例如,'\xeb\x2a'可以更方便地指定为0xeb2a或0x2aeb根据您真正想要的值.
我发现一些使用多字符常量的区域是提出可以在调试器或内存转储中识别的聪明的枚举值:
enum CommandId {
    CMD_ID_READ  = 'read',
    CMD_ID_WRITE = 'writ',
    CMD_ID_DEL   = 'del ',
    CMD_ID_FOO   = 'foo '
};
上面的可移植性问题很少(除了可能会出现小的整数或警告的平台).无论字符是以小端还是大端形式出现在枚举值中,代码仍然可以工作(除非你在其他方面对枚举值不熟悉).如果字符最终使用的字节序不是您期望的那样,则可能会使调试器中的值不易读取,但"正确性"不会受到影响.
| 归档时间: | 
 | 
| 查看次数: | 56335 次 | 
| 最近记录: |