2012-08-25 69 views
33

我试图打印uint16_t和uint32_t值,但它没有给出所需的o/p。如何打印uint32_t和uint16_t变量值?

#include<stdio.h> 
#include <netinet/in.h> 

int main() 
{ 
    uint32_t a=12,a1; 
    uint16_t b=1,b1; 
    a1=htonl(a); 
    printf("%d---------%d",a1); 
    b1=htons(b); 
    printf("\n%d-----%d",b,b1); 
    return 0; 
} 

我也使用

printf("%"PRIu32, a); 

其是否显示错误。

如何打印这些值,这将是希望的O/P

+3

向我们展示(确切!)错误消息而不是仅仅说它是“显示错误”会更有帮助。而不仅仅是“没有给出所需的o/p”,向我们展示实际的输出(并且拼出单词“输出”而不是写“o/p”)。 –

回答

53

您需要包括inttypes.h如果你想为intN_t类型和他们的兄弟所有这些引人注目的新格式说明,以及的只要你的编译器符合C99,就是正确的(即便携式)方法。如果尺寸与您的想法不同,则不应使用标准尺寸,如%d%u

它包括stdint.h,并扩展了其他一些功能,例如可用于printf/scanf调用系列的宏。 ISO C99标准的第7.8节介绍了这一点。

例如,下面的程序:

#include <stdio.h> 
#include <inttypes.h> 
int main (void) { 
    uint32_t a=1234; 
    uint16_t b=5678; 
    printf("%" PRIu32 "\n",a); 
    printf("%" PRIu16 "\n",b); 
    return 0; 
} 

输出:在<inttypes.h>定义

1234 
5678 
12

中的宏被打印的类型uint32_tuint16_t值最正确的方式,等等 - - 但他们不是唯一的方法。

就我个人而言,我发现这些宏很难记住和尴尬的使用。 (给定printf格式字符串的语法,这可能是不可避免的;我并不是说我可以想出更好的系统。)

另一种方法是将这些值转换为预定义的类型并使用那种类型。

类型intunsigned int由语言保证至少为16个位宽,并且因此能够保持int16_t类型或uint16_t的任何转换的值,分别。类似地,longunsigned long至少是32位宽,并且long longunsigned long long至少是64位宽。

例如,我可以写你的程序是这样的(有一些额外的微调):

这种方法的
#include <stdio.h> 
#include <stdint.h> 
#include <netinet/in.h> 

int main(void) 
{ 
    uint32_t a=12, a1; 
    uint16_t b=1, b1; 
    a1 = htonl(a); 
    printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1); 
    b1 = htons(b); 
    printf("%u-----%u\n", (unsigned)b, (unsigned)b1); 
    return 0; 
} 

一个优点是,它甚至可以与不支持预C99实现工作<inttypes.h>。这种实现很可能不会有<stdint.h>,但该技术对其他整数类型很有用。

+1

这里有一个很小的边缘情况,如果signed int不是二进制补码。在那种情况下,它不会正确地保持最负的二进制补码值。非常小,我会承认,但如果你想要最大限度的便携性要注意。 – paxdiablo

+1

@paxdiablo:'intN_t'类型需要是二进制补码,没有填充位。如果'int'不是二进制补码,那么'intN_t'类型可能不会被定义,除非*实现支持不同的二进制补码类型。好点,但我认为这是一个比你的建议更小的边缘情况。 –

+1

毫无疑问。我怀疑你会很难在这个星球上找到一台运动着这个新积分类型的机器,但它仍然有一个补码或符号/幅度“int”型:-) – paxdiablo

-2

就我而言,我只是用%u来输出值为uint32_t类型。它确实有效。

例如

uint32_t i = 31 - __builtin_clz(mask); 

    D("read i= %u ", __FUNCTION__, i); 
+2

这会导致系统中未定义的行为,其中sizeof (unsigned int)!= sizeof(uint32_t)'。 – user694733

+0

感谢兄弟。而且我还发现我们可以使用'%08x'来呈现它。它将显示为二进制。 –

+1

使用'%08x'与'%u'有同样的问题。此外,它将显示值为十六进制数字;标准C printf中没有二进制说明符。 – user694733