使用printf打印clock_t的正确方法是什么?

Spi*_*dey 29 c io printf clock

我目前正在使用显式强制转换unsigned long long并使用%llu它来打印它,但既然size_t有说明%z符,为什么没有clock_t

甚至没有宏观.也许我可以假设在x64系统(操作系统和CPU)size_t上长度为8个字节(即使在这种情况下,他们已提供%z),但是呢clock_t

Cir*_*四事件 27

似乎没有完美的方式.问题的根源clock_t可以是整数或浮点.

clock_t可以是浮点类型

正如BastienLéonard 提到的POSIX(向上投票),C99 N1256草案 7.23.1/3也说:

[clock_t]是能够表示时间的算术类型

和6.2.5/18:

整数和浮点类型统称为算术类型.

并且标准将算术类型定义为整数或浮点类型.

如果您将除以CLOCKS_PER_SEC,请使用long double

返回值clock()是实现定义的,获取标准含义的唯一方法是除以CLOCKS_PER_SEC查找秒数:

clock_t t0 = clock();
/* Work. */
clock_t t1 = clock();
printf("%Lf", (long double)(t1 - t0));
Run Code Online (Sandbox Code Playgroud)

由于以下两个原因,这已经足够好了,虽然不是很完美:

  • 似乎没有intmax_t浮点类型的模拟:如何获得最大的精度浮点数据类型的实现及其printf说明符?因此,如果明天出现更大的浮点类型,则可以使用它并破坏您的实现.

  • 如果clock_t是一个整数,则将float定义为使用最近的float.您可能会失去精度,但与绝对值相比并不重要,并且只会long int在很长一段时间内发生,例如在x86中是具有64位有效的80位浮点数,这是几百万年的秒数.

如果说类似的东西,那就去投票.

如果您认为它是一个整数,请使用%ju和uintmax_t

虽然unsigned long long目前是最大的标准整数类型:

因此最好将类型转换为可能的最大无符号整数类型:

#include <stdint.h>

printf("%ju", (uintmax_t)(clock_t)1);
Run Code Online (Sandbox Code Playgroud)

uintmax_t 保证在机器上具有最大可能的整数大小.

uintmax_t并且它的printf说明符%ju是在c99和gcc中引入的,例如实现它们.

作为奖励,这一劳永逸地解决了如何可靠printf整数类型的问题(遗憾的是不一定是这种情况clock_t).

如果它是双重的话会出现什么问题:

  • 如果太大而不适合整数,未定义的行为
  • 远小于1,将四舍五入为0,你将看不到任何东西

由于这些后果比整数到浮点转换更严重,因此使用float可能是更好的主意.

在glibc 2.21上它是一个整数

手册说使用double是一个更好的主意:

在GNU/Linux和GNU/Hurd系统上,clock_t等效于long int,CLOCKS_PER_SEC是整数值.但在其他系统中,clock_t和宏CLOCKS_PER_SEC都可以是整数或浮点类型.将CPU时间值转换为加倍,如上例所示,确保算术和打印等操作无论底层表示是什么都能正常且一致地工作.

在glibc 2.21中:

也可以看看

  • `%ju`?这打印完全'ju` (3认同)

Bas*_*ard 12

据我所知,你做的方式是最好的.除了clock_t可能是一个真实的类型:

time_t并且clock_t应该是整数或实数浮动类型.

http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html


lem*_*nad 11

这可能是因为时钟滴答不是一个非常明确的单位.您可以将其转换为秒并将其打印为double:

time_in_seconds = (double)time_in_clock_ticks / (double)CLOCKS_PER_SEC;
printf("%g seconds", seconds);
Run Code Online (Sandbox Code Playgroud)

CLOCKS_PER_SEC宏扩展为表示一秒钟内时钟周期数的表达式.


归档时间:

查看次数:

57424 次

最近记录:

8 年,8 月 前