reiniciar - hard reset moto z2 play
¿Cómo formatear un int largo sin firmar largo usando printf? (12)
Además de lo que la gente escribió hace años:
- puede obtener este error en gcc / mingw:
main.c:30:3: warning: unknown conversion type character ''l'' in format [-Wformat=]
printf("%llu/n", k);
Entonces su versión de mingw no es por defecto c99.
Agregue este indicador de compilador:
-std=c99
.
#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.
Asumo que este resultado inesperado es de la impresión del
unsigned long long int
.
¿Cómo se
printf()
una
unsigned long long int
?
Aparentemente, nadie ha ideado una solución multiplataforma * durante más de una década desde [el] año 2008, por lo que añadiré la mía. Plz upvote. (Bromeando. No me importa.)
Solución:
lltoa()
Cómo utilizar:
#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s/n", lltoa(5555555555, dummy, 10));
printf("Another one: %s/n", lltoa(15555555555, dummy, 10));
Ejemplo de OP:
#include <stdio.h>
#include <stdlib.h> /* lltoa() */
int main() {
unsigned long long int num = 285212672; // fits in 29 bits
char dummy[255];
int normalInt = 5;
printf("My number is %d bytes wide and its value is %s. "
"A normal number is %d./n",
sizeof(num), lltoa(num, dummy, 10), normalInt);
return 0;
}
A diferencia de la cadena de formato de impresión
%lld
, esta me funciona
bajo GCC de 32 bits en Windows.
*) Bueno,
casi
multiplataforma.
En MSVC, aparentemente necesitas
_ui64toa()
lugar de
lltoa()
.
Bueno, una forma es compilarlo como x64 con VS2008
Esto funciona como cabría esperar:
int normalInt = 5;
unsigned long long int num=285212672;
printf(
"My number is %d bytes wide and its value is %ul.
A normal number is %d /n",
sizeof(num),
num,
normalInt);
Para el código de 32 bits, necesitamos usar el especificador de formato __int64 correcto% I64u. Así se convierte.
int normalInt = 5;
unsigned __int64 num=285212672;
printf(
"My number is %d bytes wide and its value is %I64u.
A normal number is %d",
sizeof(num),
num, normalInt);
Este código funciona para el compilador VS de 32 y 64 bits.
Compílalo como x64 con VS2005:
% llu funciona bien.
En Linux es
%llu
y en Windows es
%I64u
Aunque he encontrado que no funciona en Windows 2000, parece que hay un error allí!
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 encontrarás que también es portátil a Linux.
Intenta esto en su lugar:
#include <stdio.h>
#include <inttypes.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
/* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d./n", sizeof(num), num, normalInt);
return 0;
}
Salida
My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Las cosas no estándar son siempre extrañas :)
para la porción larga larga bajo GNU es
L
,
ll
o
q
y debajo de las ventanas creo que es sólo
ll
Maleficio:
printf("64bit: %llp", 0xffffffffffffffff);
Salida:
64bit: FFFFFFFFFFFFFFFF
Por mucho tiempo (o __int64) usando MSVS, debe usar% I64d:
__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d/n",a,b); //I is capital i
Puede intentar usar la biblioteca inttypes.h que le ofrece tipos como
int32_t
,
int64_t
,
uint64_t
, etc. A continuación, puede usar sus macros como:
uint64_t x;
uint32_t y;
printf("x: %"PRId64", y: %"PRId32"/n", x, y);
Esto está "garantizado" para no darle el mismo problema que a
long
,
unsigned long long
, a
long
, etc., ya que no tiene que adivinar cuántos bits hay en cada tipo de datos.
Use el modificador largo-largo ll (el-el) con la conversión u (sin signo). (Funciona en windows, gnu).
printf("%llu", 285212672);
%d
-> para
int
%u
-> para
unsigned int
%ld
-> por
long int
%lu
-> para
unsigned long int
%lld
-> por
long long int
%llu
-> para
unsigned long long int