¿Constante hexadecimal sin signo en C?


¿C trata constantes hexadecimales (por ejemplo, 0x23FE) y con o sin signo int?

Author: Amr Bekhit, 2011-01-19

3 answers

El número en sí siempre se interpreta como un número no negativo. Las constantes hexadecimales no tienen un signo ni ninguna forma inherente de expresar un número negativo. El tipo de la constante es la primera de ellas que puede representar su valor:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
 24
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 16:27:10

Los trata como int literales (básicamente, como firmado int!). Para escribir un literal sin signo basta con añadir u al final:

0x23FEu
 11
Author: AraK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 16:26:08

De acuerdo con cppreference, el tipo del literal hexadecimal es el primer tipo de la siguiente lista en el que puede caber el valor.

int
unsigned int
long int
unsigned long int
long long int(since C99)
unsigned long long int(since C99) 

Así que depende de qué tan grande sea tu número. Si su número es menor que INT_MAX, entonces es del tipo int. Si su número es mayor que INT_MAX pero menor que UINT_MAX, es de tipo unsigned int, y así sucesivamente.

Dado que 0x23FE es menor que INT_MAX (que es 0x7FFF o mayor), es del tipo int.

Si quieres ser sin signo, añadir un u al final del número: 0x23FEu.

 1
Author: Searene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 00:46:16