sintaxis - ¿Por qué ''char'' está firmado por defecto en C++?
sintaxis de c++ pdf (2)
¿Por qué es char por defecto en el rango de -128 a 127 cuando se supone que representa un "carácter" cuyas representaciones textuales están en el rango de 0 a 255? En este sentido, supongo que char debería estar sin firmar de forma predeterminada, solo si intentamos tratarlo solo como ''números'' tendríamos que agregar la palabra clave ''firmada''. Por lo tanto, ¿debería utilizar caracteres sin firmar cuando trabajo con archivos de texto?
Tampoco entiendo por qué las std::ofstream
de lectura y escritura de std::ofstream
usan char
y no unsigned char
cuando necesito trabajar con archivos binarios. Ahí no me importa la firma, ¿verdad? Además, he hecho con éxito una copia de un archivo JPEG utilizando caracteres signed char
como este:
//..open all streams..
char c;
while(input.peek()!=EOF){
input.read(&c,1); //std::ifstream input;
output.write(&c,1); //std::ofstream output;
}
//..close all streams..
Dado que funciona, creo que la read
lee un unsigned byte
(en el procesamiento de la imagen se usa comúnmente un unsigned char
) y establece c
para que el valor tenga alguna interpretación con firma accidental en el complemento de 2. Necesito crear un histograma de valores, pero recibo un error de tiempo de ejecución porque utilizo el carácter de signo como índice. ¿No es bastante estúpido que tenga que usar algunos cast uc = (unsigned char)c;?
¿Cuándo podría haber al menos una simple sobrecarga de lectura / escritura para caracteres sin firma?
Aquí está tu respuesta de la norma:
3.9.1 Tipos fundamentales [basic.fundamental]
1 Los objetos declarados como caracteres char) serán lo suficientemente grandes para almacenar cualquier miembro del conjunto de caracteres básico de la implementación. Si un carácter de este conjunto se almacena en un objeto de carácter, el valor integral de ese objeto de carácter es igual al valor de la forma literal de un solo carácter de ese carácter. Está definido por la implementación si un objeto char puede contener valores negativos. Los caracteres pueden ser declarados explícitamente sin firmar o firmados. Char simple, char firmado y unsigned son tres tipos distintos. Un char, un char firmado y un char no firmado ocupan la misma cantidad de almacenamiento y tienen los mismos requisitos de alineación (basic.types); Es decir, tienen la misma representación de objeto. Para los tipos de caracteres, todos los bits de la representación del objeto participan en la representación del valor. Para tipos de caracteres sin signo, todos los patrones de bits posibles de la representación del valor representan números. Estos requisitos no son válidos para otros tipos. En cualquier implementación particular, un objeto char simple puede tomar los mismos valores que un char firmado o un char sin firmar; cuál es la implementación definida.
No lo es
La firmeza de un char
que no es un signed char
o un unsigned char
está definida por la implementación. Muchos sistemas hacen que esté firmado para coincidir con otros tipos que están firmados de manera predeterminada (como int
), pero puede que no esté firmado en algunos sistemas. (Por -funsigned-char
, si pasas -funsigned-char
a GCC).