问题描述
这是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());
很明显我很想念。
解决方法
问题出在您的printf
格式的字符串中。
%d
是带符号整数的格式说明符。
您正在有效地读取无符号整数,就像它是有符号的一样。
改为使用%u
:)然后,您的代码变为
for (i=0; i< 10; ++i)
printf("Random: %u\n",g_random_int());
以下是C中各种格式说明符的参考:http://www.cplusplus.com/reference/cstdio/printf/
编辑
我相信这是C99标准中的一段,描述了格式化输出函数未定义行为的情况,@ 12431234123412341234123指的是:
在调用其中一个格式化输出函数时,使用转换说明符而不是所描述的(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)。
有关未定义行为的更多情况,请参见此页面:https://gist.github.com/Earnestly/7c903f481ff9d29a3dd1
EDIT2
有关此问题的更明智的讨论,请参阅评论部分。