你如何printf一个unsigned long long int(unsigned long long int的格式说明符)?

#include 
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 。你如何 printf()一个 unsigned long long int

0
额外 编辑
意见: 1
我建议使用stdint.h并明确说明变量中的位数。我们仍处于32位和64位体系结构之间的转换时期,“unsigned long long int”并不意味着两者都是相同的。
额外 作者 BD at Rivenhill,
我用gcc编译了你的代码(用%llu),输出结果是正确的。你是否将任何选项传递给编译器?
额外 作者 Juan,
请注意,samsung bada的newlib似乎不支持“%lld”: developer.bada.com/forum/…
额外 作者 RzR,

9 答案

那么,一种方法是用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编译器。

0
额外

非标准的东西总是很奇怪:)

for the long long portion under GNU it's L, ll or q

并在Windows下,我相信它只是 ll

0
额外

你可能想尝试使用给你类型的inttypes.h库 int32_tint64_tuint64_t 等 然后你可以使用它的宏,例如:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

这是“保证”,不会给你像 longunsigned long long 等一样的麻烦,因为你不必猜测每个数据类型有多少位。

0
额外
@happy_marmoset:它们在 inttypes.h 中定义
额外 作者 Nathan Fellman,
整数都包含在inttypes中,也包含可在stdbool.h中找到的bools
额外 作者 user2316602,
inttypes.h 标准吗?它不是 stdint.h 吗?
额外 作者 MD XF,
这些 PRId64PRId32 宏是在哪里定义的?
额外 作者 happy_marmoset,
我认为你需要 PRIu64PRIu32 作为无符号整数。
额外 作者 Lasse Kliemann,

In Linux it is %llu and in Windows it is %I64u

虽然我发现它在Windows 2000中不起作用,但似乎有一个错误!

0
额外
听起来像MS再次行使“创新自由”...... ;-)
额外 作者 Dronz,
正是我所观察到的。我写了一个使用这个构造的应用程序,它在WinXP上完美运行,但是在Win2k上发生垃圾回收。也许这与C库对内核的系统调用有关,也许这与Unicode有关,谁知道。我记得使用_i64tot()或类似的东西来解决它。
额外 作者 Adam Pierce,
与Windows,(或至少,与微软C编译器的Windows)还有%I64d,%I32u和%I32d
额外 作者 JustJeff,
它与Windows 2000有什么关系? C库是处理printf的库。
额外 作者 CMircea,

十六进制:

printf("64bit: %llp", 0xffffffffffffffff);

输出:

64bit: FFFFFFFFFFFFFFFF
0
额外
但是,几乎所有的C ++和C编译器都会给出警告:警告:使用'll'长度修饰符和'p'类型字符[-Wformat =]
额外 作者 Seshadri R,
非常好!我想知道如何以十六进制表示得到它
额外 作者 RE-Beginner,

使用ll(el-el)long-long修饰符和u(无符号)转换。 (在Windows,GNU中工作)。

printf("%llu", 285212672);
0
额外
这不是Linux / UNIX的事情,如果它在“Microsoft C”中不起作用,则将“ll”长度修饰符添加到C99中的标准C中,那么这是因为它们不符合标准。
额外 作者 Robert Gamble,
适用于Windows的Turbo C ++
额外 作者 Patrick McDonald,
我不明白为什么这种高度回应的答案尚未被接受。
额外 作者 0decimal0,
适用于VS2008。而且,据我记得MS C编译器(当设置为直接编译C时)应该是C90兼容设计; C99介绍了一些不是每个人都喜欢的东西。
额外 作者 スーパーファミコン,
一切都随着64位机器而改变
额外 作者 Antarus,
对于十六进制输出,无符号长整型将使用%I64x打印。实际上可移植的方法是将数字转换为intmax_t并使用PRIXMAX。要在GNU编译器中使用PRIXMAX或类似于C ++的任何程序,您必须#define __STDC_FORMAT_MACROS。在我所描述的条件下,我得到的PRIXMAX的定义似乎是错误的,我必须强制使用%I64X。
额外 作者 cardiff space man,
使用交叉编译为x86_64(x86_64-w64-mingw32-g ++)的%lx与长整型unsigned int的Cygwin编译器会产生格式和类型不一致的错误,并使用具有相同变量的%llx和相同的编译器会提供%llx是未知格式的错误。而变量实际上是一个pthread_t。所以它不能“在Windows / GNU中工作”,问题不在于它是微软的编译器。
额外 作者 cardiff space man,
在Windows上不起作用 - 这仅适用于Linux / UNIX。
额外 作者 Paul Hargreaves,
或者更准确地说,它是用于GNU libc的,并且不适用于微软的C运行时。
额外 作者 Mark Baker,
我正在使用Visual C ++ 2005,它工作正常
额外 作者 JProgrammer,
这里需要注意的一点是,如果您为其中一个 long long 参数传递给 printf 并使用错误格式%d 而不是%lld ,那么甚至在之后打印的参数可能完全关闭(或甚至可能导致 printf 崩溃)。实质上,可变参数传递给printf而没有任何类型信息,所以如果格式字符串不正确,结果是不可预测的。
额外 作者 dmitrii,
Heard Herb Sutter在一次采访中表示,微软的客户不会要求C99,因此他们的纯C编译器已经被冻结在C90上。如果你编译为C,那就适用了。如果你编译为C ++,就像其他人在上面提到的那样,你应该没问题。
额外 作者 ahcox,
在@Nathan Fellman的回答中使用PRId64。
额外 作者 jcoffland,

这是因为%llu在Windows下无法正常工作,并且%d无法处理64位整数。我建议使用PRIu64,你会发现它也可以移植到Linux上。

试试这个:

#include 
#include 

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.
0
额外
+1参考PRIu64,这是我从来没有见过的,但是这对于64位Linux(至少)来说似乎不可移植,因为PRIu64扩展为“lu”而不是“llu”。
额外 作者 BD at Rivenhill,
然而,为了使它更具可移植性,可以使用 int64_t 来代替,因为可能会有一些长long long long的实现
额外 作者 Lưu Vĩnh Phúc,
@BDatRivenhill Linux / Unix使用长64位的LP64
额外 作者 Lưu Vĩnh Phúc,
那为什么会这样呢?在64位Linux上,long是一个64位值,与Windows以外的其他操作系统一样。
额外 作者 Ringding,

使用VS2005将其编译为x64:

%llu运作良好。
0
额外

%d--> for int

%u--> for unsigned int

%ld--> for long int

%lu--> for unsigned long int

%lld--> for long long int

%llu--> for unsigned long long int

0
额外