variable usar tipos significado rangos float como c++ c coding-style char unsigned-char

c++ - usar - variable char java



Lectura de memoria de bytewise: “signed char*” vs “unsigned char*” (5)

Debes usar caracteres unsigned char . El estándar C99 dice que el unsigned char es el único tipo que se garantiza que es denso (sin bits de relleno), y también define que puede copiar cualquier objeto (excepto los campos de bits) exactamente copiándolo en una matriz de caracteres unsigned char , que es la representación del objeto en bytes

La interepretación sensata de esto es para mí, que si usa un puntero para acceder a un objeto como bytes, debe usar caracteres unsigned char .

Referencia: http://blackshell.com/~msmud/cstd.html#6.2.6.1 (De C1x draft C99)

A menudo es necesario leer de la memoria un byte a la vez, como en esta memcpy() ingenua de memcpy() :

void *memcpy(void *dest, const void *src, size_t n) { char *from = (char *)src; char *to = (char *)dest; while(n--) *to++ = *from++; return dest; }

Sin embargo, a veces veo que las personas usan de forma explícita el unsigned char * lugar de solo char * .

Por supuesto, char y unsigned char pueden no ser iguales. Pero, ¿hace una diferencia si uso char * , signed char * , o unsigned char * al leer en la memoria de escritura?

ACTUALIZACIÓN: En realidad, soy plenamente consciente de que c=200 puede tener diferentes valores dependiendo del tipo de c . Lo que estoy preguntando aquí es por qué las personas a veces usan unsigned char * lugar de solo char * cuando leen memoria, por ejemplo, para almacenar un uint32_t en un char[4] .


Depende de lo que quieras almacenar en el char. Un char firmado le da un rango de -127 a 127, mientras que un char sin signo va de 0 a 255.

Para la aritmética de punteros no importa.


En su ejemplo de código no hace ninguna diferencia. Pero si desea mostrar / imprimir el valor del byte que lo hace (ya que el bit más alto se interpreta de manera diferente), y el unsigned char parece más adecuado


Este es un punto en el que C ++ difiere de C. En términos generales, C solo garantiza que el acceso a la memoria unsigned char funciona para caracteres unsigned char ; char puede estar firmado, y en un complemento de 1 o en una máquina de magnitud firmada, un -0 puede convertirse a +0 automáticamente, cambiando el patrón de bits. Por alguna razón (desconocida para mí), el comité de C ++ extiende las garantías que respaldan la copia transparente (sin cambios en los patrones de bits) a char , así como unsigned char ; en un complemento de 1 o en una máquina de magnitud firmada, los implementadores no tienen más remedio que hacer que las char simples no char firmadas, para evitar tales efectos secundarios. (Y, por supuesto, la mayoría de los programadores de hoy no están preocupados por tales máquinas).

De todos modos, el resultado final es que los programadores más antiguos, que provienen de un fondo en C (y quizás hayan trabajado en un complemento de 1 o en una máquina de magnitud con unsigned char utilizarán automáticamente caracteres unsigned char . También es una convención frecuente reservar caracteres simples para datos de caracteres de forma única, con caracteres con signed char para valores integrales muy pequeños y caracteres unsigned char para memoria unsigned char , o cuando se pretende la manipulación de bits. Tal regla permite al lector distinguir entre diferentes usos (siempre que se siga religiosamente).


#include<stdio.h> #include<string.h> int main() { unsigned char a[4]={254,254,254,''/0''}; unsigned char b[4]; char c[4]; memset(b,0,4); memset(c,0,4); memcpy(b,a,4); memcpy(c,a,4); int i; for(i=0;i<4;i++) { printf("/noriginal is %d",a[i]); printf("/nchar %d is %d",i,c[i]); printf("/nunsigned char %d is %d /n/n",i,b[i]); } }

la salida es

original is 254 char 0 is -2 unsigned char 0 is 254 original is 254 char 1 is -2 unsigned char 1 is 254 original is 254 char 2 is -2 unsigned char 2 is 254 original is 0 char 3 is 0 unsigned char 3 is 0

Así que aquí, tanto char como unsign, tienen el mismo valor, por lo que no importa en este caso

Editar

Si lees algo como un signo firmado, en ese caso, la mayoría de los bits más altos también se copiarán, por lo que no importa.