tipos descripcion datos c types

descripcion - Diferencia entre signo/sin signo char



meta title y meta descripcion (8)

Esta pregunta ya tiene una respuesta aquí:

Entonces sé que la diferencia entre un int firmado y un sin firmar es que un bit se usa para indicar si el número es positivo o negativo, pero ¿cómo se aplica esto a un char? ¿Cómo puede un personaje ser positivo o negativo?


De la misma manera, cómo un int puede ser positivo o negativo. No hay diferencia. En realidad, en muchas plataformas no se firma el char .


De la misma manera, por ejemplo, si tiene un char de 8 bits, se pueden usar 7 bits para la magnitud y 1 para el signo. Por lo tanto, un carácter sin signo puede oscilar entre 0 y 255, mientras que un carácter con signo puede variar de -128 a 127 (por ejemplo).


Esto porque un char se almacena en todos los efectos como un número de 8 bits. Hablar de un carácter negativo o positivo no tiene sentido si lo considera un código ASCII (que puede simplemente firmarse *), pero tiene sentido si usa ese char para almacenar un número, que podría estar en el rango 0-255 o en -128..127 según la representación de 2 complementos.

*: también puede estar sin firmar, en realidad depende de la implementación, creo que, en ese caso, tendrá acceso al juego de caracteres ASCII extendido proporcionado por la codificación utilizada


Estoy un poco en desacuerdo con lo anterior. El carácter sin signo simplemente significa: utilice el bit más significativo en lugar de tratarlo como un indicador de bit para signo +/- al realizar operaciones aritméticas.

Tiene importancia si usas char como un número, por ejemplo:

typedef char BYTE1; typedef unsigned char BYTE2; BYTE1 a; BYTE2 b;

Para la variable a , solo están disponibles 7 bits y su rango es (-127 a 127) = (+/-) 2 ^ 7 -1. Para la variable b, todos los 8 bits están disponibles y el rango es de 0 a 255 (2 ^ 8 -1).

Si usa char como carácter, el compilador ignorará por completo "unsigned", al igual que los comentarios de su programa.


Hay tres tipos de char: char (llano), signed char y unsigned char . Cualquier char es generalmente un entero de 8 bits * y, en ese sentido, un carácter signed y unsigned char tiene un significado útil (generalmente equivalente a uint8_t e int8_t ). Cuando se usa como un personaje en el sentido del texto, use un char (también conocido como un carácter simple). Esto es típicamente un signed char pero puede ser implementado de cualquier manera por el compilador.

* Técnicamente, un char puede ser de cualquier tamaño, siempre que sizeof(char) sea ​​1, pero generalmente es un entero de 8 bits.


La representación es la misma, el significado es diferente. por ejemplo, 0xFF, ambos representados como "FF". Cuando se trata como "char", es número negativo -1; pero es 255 como unsigned. Cuando se trata de cambios de bit, es una gran diferencia ya que el bit de signo no se desplaza. por ejemplo, si cambia 255 a la derecha 1 bit, obtendrá 127; desplazar "-1" a la derecha no tendrá efecto.


Un ''signo firmado'' es un valor firmado que, por lo general, es más pequeño que, y se garantiza que no es más grande que, un ''corto''. Un ''char sin signo'' es un valor sin signo que, por lo general, es más pequeño que, y se garantiza que no es mayor que, un ''corto''. Un tipo ''char'' sin calificador firmado o sin firmar puede comportarse como un char firmado o no firmado; esto generalmente es definido por la implementación, pero hay un par de casos donde no lo es:

  1. Si, en el conjunto de caracteres de la plataforma de destino, cualquiera de los caracteres requeridos por el estándar C se correlaciona con un código más alto que el máximo de caracteres con signo, entonces ''char'' debe estar sin signo.
  2. Si ''char'' y ''short'' tienen el mismo tamaño, entonces ''char'' debe estar firmado.

Parte de la razón por la que hay dos dialectos de "C" (aquellos donde está firmado ''char'', y aquellos donde no está firmado) es que hay algunas implementaciones donde ''char'' debe estar sin firmar, y otros donde debe estar firmado.


No hay un "tipo de personaje" dedicado en el lenguaje C. char es un tipo entero, igual (en ese sentido) que int , short y otros tipos enteros. char resulta ser el tipo entero más pequeño. Entonces, al igual que cualquier otro tipo de entero, puede estar firmado o sin firmar.

Es cierto que (como su nombre lo indica) char está pensado principalmente para ser usado para representar personajes. Pero los caracteres en C están representados por sus "códigos" enteros, por lo que no hay nada inusual en el hecho de que un tipo de entero de caracteres se utiliza para cumplir ese propósito.

La única diferencia general entre los tipos de caracteres char y otros tipos enteros es que el char simple no es generalmente sinónimo de caracteres con signed char , mientras que con otros tipos de elementos enteros el modificador signed es opcional / implícito.