g_random_int返回负数

问题描述

这是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

有关此问题的更明智的讨论,请参阅评论部分。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...