#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 longargumentosprintfy usa el formato incorrecto para uno de ellos, digamos en%dlugar de%lld, entonces incluso los argumentos impresos después del incorrecto pueden estar completamente desactivados (o incluso pueden provocarprintfun 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_tetc. A continuación, puede utilizar sus macros, tales como:Esto está "garantizado" para no darle el mismo problema
long,unsigned long longetc., ya que no tiene que adivinar cuántos bits hay en cada tipo de datos.fuente
PRId64, lasPRId32macros definidas?inttypes.hPRIu64yPRIu32para enteros sin signo.inttypes.hestándar? ¿No sería asístdint.h?leastXyfastX(que en realidad pueden ser más anchos de lo indicado) son obligatorios.%d-> paraint%u-> paraunsigned int%ld-> paralong intolong%lu-> paraunsigned long intolong unsigned intounsigned long%lld-> paralong long intolong long%llu-> paraunsigned long long intounsigned long longfuente
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_ten su lugar porque es muy posible que algunas implementaciones, con mucho, mucho más grande que la de largoEn Linux es
%lluy en Windows es%I64uAunque he descubierto que no funciona en Windows 2000, ¡parece que hay un error allí!
fuente
unsigned long longtipo 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ándoI64use 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
%lldcadena 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,lloqy bajo ventanas creo que es
llsolofuente
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