C g_random_int()返回负数

C g_random_int()返回负数,c,glib,C,Glib,这是GLib的g_random_int()函数的文档: guint32 g_random_int (void); Return a random guint32 equally distributed over the range [0..2^32-1]. 但以下代码返回负数: for (i=0; i< 10; ++i) printf("Random: %d\n", g_random_int()); (i=0;i

这是GLib的g_random_int()函数的文档:

 guint32 g_random_int (void);
 Return a random guint32 equally distributed over the range [0..2^32-1].
但以下代码返回负数:

 for (i=0; i< 10; ++i)
     printf("Random: %d\n", g_random_int());
(i=0;i<10;++i)的

printf(“随机:%d\n”,g_Random_int());

我明显缺少了一些内容。

问题在于您的
printf
-格式字符串

%d
是有符号整数的格式说明符

您实际上是在读取无符号整数,就像它是有符号的一样

使用
%u
代替:)然后您的代码变为

 for (i=0; i< 10; ++i)
     printf("Random: %u\n", g_random_int());
(i=0;i<10;++i)的

printf(“随机:%u\n”,g_Random_int());
以下是C中各种格式说明符的参考:

编辑

我相信这是C99标准中描述格式化输出函数未定义行为的一段,@指:

在对其中一个格式化输出函数的调用中,精度会显示为转换说明符(7.19.6.1、7.24.2.1)以外的其他说明符

。。或者可能是这样的:

在其中一个格式化输入/输出函数或strftime或wcsftime函数(7.19.6.1、7.19.6.2、7.23.3.5、7.24.2.1、7.24.2.2、7.24.5.1)的格式中发现无效的转换规范

有关未定义行为的更多情况,请参见本页:

EDIT2


有关此问题的更智能的讨论,请参见注释部分。

问题在于您的
printf
-格式字符串

%d
是有符号整数的格式说明符

您实际上是在读取无符号整数,就像它是有符号的一样

使用
%u
代替:)然后您的代码变为

 for (i=0; i< 10; ++i)
     printf("Random: %u\n", g_random_int());
(i=0;i<10;++i)的

printf(“随机:%u\n”,g_Random_int());
以下是C中各种格式说明符的参考:

编辑

我相信这是C99标准中描述格式化输出函数未定义行为的一段,@指:

在对其中一个格式化输出函数的调用中,精度会显示为转换说明符(7.19.6.1、7.24.2.1)以外的其他说明符

。。或者可能是这样的:

在其中一个格式化输入/输出函数或strftime或wcsftime函数(7.19.6.1、7.19.6.2、7.23.3.5、7.24.2.1、7.24.2.2、7.24.5.1)的格式中发现无效的转换规范

有关未定义行为的更多情况,请参见本页:

EDIT2


请参阅评论部分,了解关于该问题的更为明智的讨论。

这是技术性的。(使用具有不同签名的格式说明符)@124312344123441234123我已更新了答案。这就是您所指的UB案例吗?从C11标准工作草案第7.21.6.1 p9节中,我在描述
fprintf
函数时发现了这一点:如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。@MortenJensen I参考第7.15.1.1:2节…或者如果类型与实际下一个参数的类型不兼容(根据默认参数升级),则行为未定义。。。但是我必须纠正我自己,当值可以用两种类型表示并且只有符号不同时,这不是UB。但是我不知道有哪一个实现会因为错误的符号而导致问题。(除了打印意外值,如问题中所示)这是技术问题。(使用具有不同签名的格式说明符)@124312344123441234123我已更新了答案。这就是您所指的UB案例吗?从C11标准工作草案第7.21.6.1 p9节中,我在描述
fprintf
函数时发现了这一点:如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。@MortenJensen I参考第7.15.1.1:2节…或者如果类型与实际下一个参数的类型不兼容(根据默认参数升级),则行为未定义。。。但是我必须纠正我自己,当值可以用两种类型表示并且只有符号不同时,这不是UB。但是我不知道有哪一个实现会因为错误的符号而导致问题。(打印意外值除外,如问题中所示)