#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;
}
输出:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
我假设这个意外的结果来自于输出unsigned long long int。你如何打印()一个unsigned long long int?
一种方法是用VS2008将其编译为x64
这运行如你所料:
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);
对于32位代码,我们需要使用正确的__int64格式说明符%I64u。所以它变成了。
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);
这段代码适用于32位和64位VS编译器。
您可能想尝试使用inttypes.h库,它可以为您提供诸如
Int32_t, int64_t, uint64_t等。
然后你可以使用它的宏,如:
#include <inttypes.h>
uint64_t x;
uint32_t y;
printf("x: %"PRIu64", y: %"PRIu32"\n", x, y);
这“保证”不会给您带来与long、unsigned long等相同的麻烦,因为您不必猜测每种数据类型中有多少位。
这是因为%llu不能在Windows下正常工作,而%d不能处理64位整数。我建议使用PRIu64,你会发现它也可以移植到Linux上。
试试这个吧:
#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;
}
输出
My number is 8 bytes wide and its value is 285212672. A normal number is 5.
如何使用printf格式化unsigned long long int ?
由于C99在转换说明符o,u,x, x之前使用了“ll”(ell-ell)。
很多答案中除了10进制选项外,还有16进制和8进制选项:
选择包括
unsigned long long num = 285212672;
printf("Base 10: %llu\n", num);
num += 0xFFF; // For more interesting hex/octal output.
printf("Base 16: %llX\n", num); // Use uppercase A-F
printf("Base 16: %llx\n", num); // Use lowercase a-f
printf("Base 8: %llo\n", num);
puts("or 0x,0X prefix");
printf("Base 16: %#llX %#llX\n", num, 0ull); // When non-zero, print leading 0X
printf("Base 16: %#llx %#llx\n", num, 0ull); // When non-zero, print leading 0x
printf("Base 16: 0x%llX\n", num); // My hex fave: lower case prefix, with A-F
输出
Base 10: 285212672
Base 16: 11000FFF
Base 16: 11000fff
Base 8: 2100007777
or 0x,0X prefix
Base 16: 0X11000FFF 0
Base 16: 0x11000fff 0
Base 16: 0x11000FFF
格式化unsigned long long的一种可能是使用uintmax_t。该类型自C99以来就可用,与stdint.h中发现的其他一些可选的精确宽度类型不同,uintmax_t是标准所要求的(它的带符号的对应对象intmax_t也是如此)。
根据标准,uintmax_t类型可以表示任何无符号整数类型的任何值。
你可以使用%ju转换说明符打印uintmax_t值(并且intmax_t可以使用%jd打印)。要打印一个不是uintmax_t的值,你必须先转换为uintmax_t以避免未定义的行为:
#include <stdio.h>
#include <stdint.h>
int main(void) {
unsigned long long num = 285212672;
printf("%ju\n", (uintmax_t)num);
return 0;
}