在C/C+中\x是什么意思+;?

在C/C+中\x是什么意思+;?,c,syntax,C,Syntax,例如: char arr[] = "\xeb\x2a"; 顺便说一句,以下是相同的吗 “\xeb\x2a”与“\xeb\x2a”这是一个特殊字符,表示字符串实际上是一个十六进制数 一个有用的网站是 我引述: x无符号十六进制整数 这样,您的\xeb类似于十进制235。\x表示十六进制字符转义。它用于指定不可键入的字符(如空的'\x00') “\xeb\x2a”是一个文字字符串(类型是char*,3个字节,以null结尾),而“\xeb\x2a”是一个字符常量(类型是int,2个字节,不以nul

例如:

char arr[] = "\xeb\x2a";
顺便说一句,以下是相同的吗


“\xeb\x2a”
“\xeb\x2a”

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

一个有用的网站是

我引述:

x无符号十六进制整数


这样,您的
\xeb
类似于十进制235。

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


“\xeb\x2a”
是一个文字字符串(类型是
char*
,3个字节,以null结尾),而
“\xeb\x2a”
是一个字符常量(类型是
int
,2个字节,不以null结尾,只是写入0xEB2A、60202或0165452的另一种方式)。不一样:)

这个
\x
表示它是一个十六进制字符转义。因此,
\xeb
表示十六进制字符
eb
,或十进制字符
235
。有关矿石信息,请参阅

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

当您说:

顺便问一下,这些是相同的:

“\xeb\x2a”对“\xeb\x2a”


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

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


这允许您指定通常不可打印的字符(其中一些具有预定义的特殊转义序列,如“\n”=换行符和“\t”=制表符“\b”=贝尔)

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

C99标准的一些进一步细节:

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

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

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

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

当在一组双引号(
)中使用时,十六进制转义序列指定的字符是以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 '
};

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

最好在此处提供完整答案,而不是将OP链接到他们可以找到它的位置,而该链接没有更多内容解释不是“十六进制转义字符”。单引号表达式不是单字节字符。“类型是
char
,2字节”-嗯,我认为这通常不适合
char
@Jefromi。我认为类型更准确地描述为
char[2]
.Updated.
'\xeb\x2a'
char[0]='\xeb'
相同吗,
char[1]='\x2a'
'\xeb\x2a'
没有char[2]类型-这是一个
int
,其值由实现定义。那么
'\xeb\x2a\xeb\x2a\xeb'
'\xeb\x2a\xeb'
呢?您能详细说明一下
'\xeb\x2a'
吗?'\xeb'是单个字符(=一个字节)所以“\xeb\x2a”是两个字节=16bit=shortint@Martin贝克特:不,包含多个字符的字符常量仍然是
int
,而不是
short int
。它的值是由实现定义的。@user198729查尔斯说的。在C中,单引号之间的任何内容都是转换的