#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编译器。

其他回答

这是因为%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.

格式化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;
}

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

对于长而长的部分 在GNU下是L, ll或q

在窗户下,我相信它只是

在Linux中是%llu,在Windows中是%I64u

虽然我发现它不能在Windows 2000中工作,但似乎有一个bug !

%d——>为int

%u——>为unsigned int

%ld—>为长int或长

%lu——>用于unsigned long int或long unsigned int或unsigned long

%lld—>表示long long int或long long

%llu——>用于unsigned long long int或unsigned long long