#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Salida:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Supongo que este resultado inesperado es de imprimir el unsigned long long int
. ¿Cómo hacer que printf()
una unsigned long long int
?
Respuestas:
Use el modificador ll (el-el) long-long con la conversión u (sin signo). (Funciona en windows, GNU).
fuente
long long
argumentosprintf
y usa el formato incorrecto para uno de ellos, digamos en%d
lugar de%lld
, entonces incluso los argumentos impresos después del incorrecto pueden estar completamente desactivados (o incluso pueden provocarprintf
un bloqueo ) Esencialmente, los argumentos variables se pasan a printf sin ningún tipo de información, por lo que si la cadena de formato es incorrecta, el resultado es impredecible.Es posible que desee probar el uso de la biblioteca inttypes.h que proporciona tipos, tales como
int32_t
,int64_t
,uint64_t
etc. A continuación, puede utilizar sus macros, tales como:Esto está "garantizado" para no darle el mismo problema
long
,unsigned long long
etc., ya que no tiene que adivinar cuántos bits hay en cada tipo de datos.fuente
PRId64
, lasPRId32
macros definidas?inttypes.h
PRIu64
yPRIu32
para enteros sin signo.inttypes.h
estándar? ¿No sería asístdint.h
?leastX
yfastX
(que en realidad pueden ser más anchos de lo indicado) son obligatorios.%d
-> paraint
%u
-> paraunsigned int
%ld
-> paralong int
olong
%lu
-> paraunsigned long int
olong unsigned int
ounsigned long
%lld
-> paralong long int
olong long
%llu
-> paraunsigned long long int
ounsigned long long
fuente
Por mucho tiempo (o __int64) usando MSVS, debe usar% I64d:
fuente
Esto se debe a que% llu no funciona correctamente en Windows y% d no puede manejar enteros de 64 bits. Sugiero usar PRIu64 en su lugar y también encontrará que es portátil para Linux.
Intenta esto en su lugar:
Salida
fuente
int64_t
en su lugar porque es muy posible que algunas implementaciones, con mucho, mucho más grande que la de largoEn Linux es
%llu
y en Windows es%I64u
Aunque he descubierto que no funciona en Windows 2000, ¡parece que hay un error allí!
fuente
unsigned long long
tipo de datos es relativamente nuevo (en ese momento, con el estándar C99) pero los compiladores de C (incluido MinGW / GCC) utilizan el antiguo tiempo de ejecución de Microsoft C que solo admitía la especificación C89. Solo tengo acceso a documentos API de Windows realmente antiguos y razonablemente recientes. Por lo tanto, es difícil decir exactamente cuándoI64u
se dejó caer el soporte. Pero suena como la era XP.Compílelo como x64 con VS2005:
fuente
Además de lo que la gente escribió hace años:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Entonces, su versión de mingw no está predeterminada en c99. Añadir esta bandera del compilador:
-std=c99
.fuente
Aparentemente, a nadie se le ha ocurrido una solución multiplataforma * durante más de una década desde [el] año 2008, por lo que añadiré la mía 😛. Por favor vota. (Bromeando. No me importa)
Solución:
lltoa()
Cómo utilizar:
Ejemplo de OP:
A diferencia de la
%lld
cadena de formato de impresión, esta funciona para mí con GCC de 32 bits en Windows.*) Bueno, casi multiplataforma. En MSVC, aparentemente necesitas en
_ui64toa()
lugar delltoa()
.fuente
lltoa
.Las cosas no estándar son siempre extrañas :)
para la porción larga larga bajo GNU es
L
,ll
oq
y bajo ventanas creo que es
ll
solofuente
Maleficio:
Salida:
fuente
Bueno, una forma es compilarlo como x64 con VS2008
Esto funciona como cabría esperar:
Para el código de 32 bits, necesitamos usar el especificador de formato __int64 correcto% I64u. Así se hace.
Este código funciona para el compilador VS de 32 y 64 bits.
fuente