sub - TABLA ASCII-valor negativo
sub zero ascii (6)
Posible duplicado:
Valor ASCII negativo
int main() {
char b = 8-''3'';
printf("%c/n",b);
return 0;
}
Ejecuto este programa y me aparece un letrero que parece un signo de interrogación (?).
Mi pregunta para usted es por qué imprime eso y no imprime nada, porque, por lo que sé, el valor de b de la tabla ASCII es menos 43, que no existe.
por cierto, cuando compilo este código:
int main() {
char b = -16;
printf("%c/n",b);
return 0;
}
No consigo nada.
El formateo %c
siempre imprimirá un carácter, así que presumiblemente solo toma los bits de tu char
y lo trata como un valor sin signo, que termina siendo algo con el bit más alto establecido. Su terminal puede mostrar estos caracteres en blanco o como marcadores de posición con signos de interrogación, pero el mío muestra Õ y ð ...
Si no desea imprimir nada cuando el valor es negativo, debe verificarlo (y usar un tipo de datos más grande, como int
para que pueda ajustar los valores que no sean char junto con todos los caracteres posibles, o signed char
si desea asegurarse de obtener un tipo firmado, un char
simple puede estar firmado o no).
Eso es porque -16
es lo mismo que hex 0xf0
que es lo mismo que 240
. En mi juego de caracteres (ISO 8859-1) ese personaje es LATIN SMALL LETTER ETH
o ''ð''
.
Este es el comportamiento especificado en el estándar C 2011
7.21.6.1 La función fprintf
...
8 Los especificadores de conversión y sus significados son:
...
c
Si no está presente ningún modificador de longitud, el argumentoint
se convierte en ununsigned char
y se escribe el carácter resultante.
Si está presente un modificador de longitudl
, el argumentowint_t
se convierte como si fuera una especificación de conversiónls
sin precisión y un argumento que apunta al elemento inicial de una matriz de dos elementos dewchar_t
, el primer elemento que contiene el argumentowint_t
para ellc
especificación de conversión y el segundo un carácter ancho nulo.
Ese -43 se está convirtiendo en un valor sin signo (213), por lo que está imprimiendo un carácter ASCII extendido.
No existe el valor "ASCII negativo". ASCII define códigos de caracteres y control para valores de 0 a 127.
La mayoría de los sistemas no usan ASCII simple. Usan algún otro conjunto de caracteres. Casi todos los demás juegos de caracteres coinciden con ASCII para los valores de 0 a 127, pero definen caracteres adicionales y códigos de control para valores más altos.
En algunas implementaciones de C y C ++, el char
corresponde a un carácter firmado que puede tomar valores de -127 a +127 (y en la mayoría de los casos de -128 a +127). En otras implementaciones, char
es un valor sin signo de 0 a 255.
Si tiene un char
firmado con un valor negativo e intenta imprimirlo, la biblioteca lo tratará como un unsigned char
(por ejemplo, -1 se convierte en 255) e imprimirá el carácter del conjunto de caracteres de la plataforma que corresponda a ese valor. Si no hay un carácter asignado a un valor particular, la biblioteca puede elegir mostrar algún carácter de marcador predeterminado, como un signo de interrogación o un recuadro.
Puede consultar la tabla ASCII . Y todos los números deben correlacionarse con (256+ (valor))% 256 (Esta es la manera en que se manejan los desbordamientos ). Debería poder encontrar qué símbolo se imprime para cada número.
los caracteres se interpretan internamente como "sin signo" durante la impresión. Por lo tanto, será 255 - 16 = 239º personaje. El valor de ascii con el pedido 239 está impreso en la consola de la pantalla. Del mismo modo, -43 es el orden 212.