2010-03-30 20 views

Respuesta

1

Se podría haber buscado en Google él. Sitio web útil here.

y cito:

x hexadecimal entero sin signo de

esta manera, su \xeb es como 235 en decimales.

+0

Ese enlace es una descripción de las cadenas de formato consumidas por 'printf()' y similares, no las secuencias de escape entendidas por un literal C. También es específico de C++, pero dado que OP está preguntando sobre el lenguaje mítico C/C++ lo dejaré pasar. – RBerteig

24

\x indica un escape de carácter hexadecimal. Se usa para especificar caracteres que no son escribibles (como un nulo '\x00').

Y "\xeb\x2a" es una cadena literal (tipo es char *, 3 bytes, terminada en cero), y '\xeb\x2a' es una constante de caracteres (tipo es int, 2 bytes, no terminada en nulo, y es más que otra manera de escribir 0xEB2A o 60202 o 0165452). No es lo mismo :)

+3

"tipo es' char', 2 bytes "- hm, no creo que por lo general vaya a caber en un" char ". – Cascabel

+0

@Jefromi Cierto, supongo que el tipo se describe con más precisión como 'char [2]'. Actualizado. – Seth

+0

¿Es ''\ xeb \ x2a'' lo mismo que' char [0] =' \ xeb'', 'char [1] = '\ x2a''? – user198729

0

El \x significa que es un escape de caracteres hexadecimales. Entonces, \xeb significará el carácter eb en hexadecimal, o 235 en decimal. Consulte http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx para obtener información sobre el mineral.

En cuanto a la segunda, no, no son lo mismo. Las comillas dobles, ", significa que es una cadena de caracteres, una matriz de caracteres terminados en nulo, mientras que una comilla simple, ', significa que es un solo carácter, el byte que representa el carácter.

+0

La expresión entre comillas simples no es un carácter de un solo byte. – Cascabel

2

Cuando dicen:

Por cierto, estas son las mismas:

"\ XEB \ X2a" vs '\ XEB \ X2a'

Ellos son, de hecho, no. El primero crea un literal de cadena de caracteres, terminado con un byte cero, que contiene los dos caracteres cuya representación hexadecimal usted proporciona. El segundo crea una constante entera.

+1

¿Puedes elaborar un poco sobre ''\ xeb \ x2a''? – user198729

+0

'\ xeb' es un carácter único (= un byte) así que '\ xeb \ x2a' ​​es dos bytes = 16 bits = corto int –

+0

@Martin Beckett: No, una constante de caracteres que contiene más de un carácter sigue siendo un 'int ', no un' short int'. Su valor es la implementación definida. –

1

\ x le permite especificar el carácter por su código hexadecimal.

Esto le permite especificar caracteres que normalmente no son imprimibles (algunos de los cuales tienen una secuencia de escape predefinidas como '\ n' = salto de línea y '\ t' = pestaña '\ b' = campana)

10

Como otros han dicho, el \x es una secuencia de escape que inicia una "secuencia de escape hexadecimal".

Algunos detalles adicionales de la norma C99:

cuando se utiliza dentro de un conjunto de comillas simples (') Los personajes son parte de un "constante de caracteres número entero" que es (6.4.4.4/2 "Las constantes de caracteres"):

una secuencia de uno o más caracteres de varios bytes encerrados entre comillas simples, como en 'x'.

y

Un carácter constante entera tiene tipo int. El valor de una constante de caracteres enteros que contiene un solo carácter que se asigna a un carácter de ejecución de un solo byte es el valor numérico de la representación del carácter correlacionado interpretado como un entero. El valor de una constante de caracteres enteros que contiene más de un carácter (por ejemplo, 'ab') o que contiene un carácter o secuencia de escape que no se correlaciona con un carácter de ejecución de un solo byte, está definido por la implementación.

Por lo tanto, la secuencia en su ejemplo de '\xeb\x2a' es un valor de implementación definido. Es probable que sea el valor int 0xeb2a o 0x2aeb dependiendo de si la plataforma objetivo es big-endian o little-endian, pero tendría que mirar con certeza la documentación de su compilador.

Cuando se utilizan dentro de un conjunto de comillas dobles (") los caracteres especificados por la secuencia de escape hexadecimal son parte de un literal de cadena terminado en nulo.

de la norma C99 6.4.5/3 "literales de cadena":

Las mismas consideraciones se aplican a cada elemento de la secuencia en una cadena de caracteres literal o una cadena literal de ancho como si fuera en una constante de caracteres enteros o constante de caracteres anchos, excepto que la comilla simple ' es representable por sí misma o por la secuencia de escape \', pero la comilla doble " se representará por la secuencia de escape \".


Otros detalles:

En mi opinión, se debe evitar evitar el uso de constantes 'de varios caracteres. Hay solo unas pocas situaciones en las que proporcionan algún valor sobre el uso de una constante normal int. Por ejemplo, '\xeb\x2a' se podría especificar de forma más portátil como 0xeb2a o 0x2aeb según el valor que realmente desee.

Una de las áreas que he encontrado constantes de caracteres múltiples para ser de alguna utilidad es para llegar a los valores de enumeración inteligentes que se pueden reconocer en un depurador o volcado de memoria:

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

hay pocos portabilidad problemas con lo anterior (que no sean plataformas que tengan pequeños ints o advertencias que puedan ser arrojadas). Ya sea que los personajes terminen en los valores enum en forma de pequeño o gran endian, el código seguirá funcionando (a menos que esté haciendo algo más impío con los valores enum). Si los caracteres terminan en el valor utilizando una endianidad que no era la esperada, puede hacer que los valores sean menos fáciles de leer en un depurador, pero la 'corrección' no se ve afectada.

+0

¿Es ''\ xeb \ x2a'' lo mismo que' char [0] =' \ xeb ', char [1] =' \ x2a''? – user198729

+0

No, como dice la respuesta, ''\ xeb \ x2a'' es un' int' con un valor definido por la implementación. El valor es casi seguro 0xeb2a o 0x2aeb; cuál dependerá casi seguramente de la endianess de la plataforma. Supongo que algunos compiladores pueden transformar ''\ xeb \ x2a'' en 0xffffeb2a si deciden firmar la extensión. No tengo idea de lo probable que podría ser. –