簡體   English   中英

用於32位ANSI C中的int64_t和uint64_t的printf()格式說明符

[英]printf() format specifier for int64_t and uint64_t in 32-bit ANSI C

我正在編寫一些用gcc編譯的32位ANSI C,在其中需要打印一些64位有符號和無符號整數。 問題在於,在gcc 32位C中, int64_tuint64_t分別使用ANSI C不支持的格式說明符%lld%llu轉換為long long int和unsigned long long int。使用提供的格式說明符宏inttypes.h也無濟於事,因為它們被轉換為%lld%llu

以下代碼無法編譯:

#include <stdio.h>
#include <inttypes.h>

int main() {
    uint64_t some_int = 123456789;
    printf("Your int is: %"PRId64"\n", some_int);
    return 0;
}

gcc main.c -ansi -Og -g -m32 -Wall -Werror -Wextra -pedantic

錯誤信息是:

error: ISO C90 does not support the ‘ll’ gnu_printf length modifier [-Werror=format=]

因此,我的問題是:在32位ANSI C中我應該使用哪種格式說明符來打印雙精度整數?

短語“ ANSI C”通常是指1989 ISO C標准定義的語言。 1990 ISO C標准描述了完全相同的語言(它增加了一些ISO強制性部分)。 ANSI正式放棄了自己的1989年標准,並采用了ISO標准,並且還采用了ISO C標准的1999年和2011年版本。 因此,由ANSI定義的C標准是2011 ISO C標准。

由於這種歧義,我建議避免使用“ ANSI C”一詞,而是指ISO發行標准的年份:C90,C99或C11。

我應該使用哪種格式說明符在32位ANSI C中打印雙精度整數?

空無一人。

C90不支持and標頭或long long類型。 它不需要支持任何64位整數類型( long 可以是64位,但通常為32位)。 因為類型不存在,所以printf沒有為它們提供格式說明符。

原則上,您可以使用支持64位long (犧牲可移植性)的C90實現,或者可以使用一組較窄的整數來實現自己的64位類型,以函數形式提供操作。

如果您可以更新問題以確切說明為什么要限制自己使用29歲的C標准版本,則可能會給出更有用的答案。 我只是告訴您使用支持C99或C11的實現,但是您已經表明這不是解決方案(無需解釋原因)。

確保可以在C89編譯器中使用64位整數的一種方法:

#include <stdio.h>
#include <assert.h>
#include <limits.h>
typedef unsigned long uint64_t;

int main() {
    uint64_t some_int = 123456789;
    assert(CHAR_BIT * sizeof(long) >= 64);
    printf("Your int is: %lu\n", some_int);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM