- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在使用显式转换为 unsigned long long
并使用 %llu
打印它,但是因为 size_t
有 %z
说明符,为什么 clock_t
没有?
它甚至没有宏。也许我可以假设在 x64 系统(OS 和 CPU)上 size_t
的长度是 8 个字节(即使在这种情况下,他们已经提供了 %z
),但是什么关于clock_t
?
最佳答案
似乎没有完美的方法。问题的根源在于 clock_t
可以是整数或 float 。
clock_t 可以是浮点型
作为Bastien Léonard mentions对于 POSIX(去投票给他),C99 N1256 draft 7.23.1/3 还说:
[clock_t is] arithmetic types capable of representing times
和 6.2.5/18:
Integer and floating types are collectively called arithmetic types.
并且标准将算术类型定义为整数或浮点类型。
如果要除以 CLOCKS_PER_SEC,请使用 long double
clock()
的返回值是实现定义的,从中获得标准含义的唯一方法是除以 CLOCKS_PER_SEC
以找到秒数:
clock_t t0 = clock();
/* Work. */
clock_t t1 = clock();
printf("%Lf", (long double)(t1 - t0));
这已经足够好了,尽管还不够完美,原因有以下两个:
对于浮点类型,似乎没有类似于 intmax_t
的类比:How to get the largest precision floating point data type of implemenation and its printf specifier?因此,如果明天出现更大的浮点类型,它可能会被使用并破坏您的实现。
如果 clock_t
是一个整数,则转换为 float 已明确定义为尽可能使用最接近的 float。您可能会失去精度,但与绝对值相比并没有多大关系,并且只会在很长时间内发生,例如long int
在x86中是80位 float ,64位有效,秒数百万年。
Go upvote lemonad谁说了类似的话。
如果您认为它是一个整数,请使用 %ju 和 uintmax_t
尽管 unsigned long long
是目前可能的最大标准整数类型:
clock_t
可能是其中之一因此最好将类型转换为可能的最大无符号整数类型:
#include <stdint.h>
printf("%ju", (uintmax_t)(clock_t)1);
uintmax_t
保证具有机器上可能的最大整数大小。
uintmax_t
及其 printf 说明符 %ju
是在 c99 中引入的,例如 gcc 实现了它们。
作为奖励,这一劳永逸地解决了如何可靠地 printf
整数类型的问题(不幸的是 clock_t
不一定是这种情况)。
如果是 double 会出什么问题:
由于这些后果比整数到 float 的转换要严重得多,因此使用 float 可能是一个更好的主意。
在 glibc 2.21 上它是一个整数
手册说使用 double
是一个更好的主意:
On GNU/Linux and GNU/Hurd systems, clock_t is equivalent to long int and CLOCKS_PER_SEC is an integer value. But in other systems, both clock_t and the macro CLOCKS_PER_SEC can be either integer or floating-point types. Casting CPU time values to double, as in the example above, makes sure that operations such as arithmetic and printing work properly and consistently no matter what the underlying representation is.
在 glibc 2.21 中:
clock_t
是long int
:
__clock_t
__CLOCK_T_TYPE
__SLONGWORD_TYPE
long int
clock()
在Linux中是用sys_clock_gettime
实现的:
__clock_gettime
SYSDEP_GETTIME_CPU
SYSCALL_GETTIME
最后进行内联系统调用man clock_gettime
,告诉我们它返回一个 struct timespec
,在 GCC 中它包含 long int
字段。
所以底层实现真的返回整数。
另见
关于c - 使用 printf 打印 clock_t 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1083142/
我想知道以下语句在 C 中会打印什么? printf("hello\n") || (printf("goodbye\n") || printf("world\n")); 我通常习惯于使用“cout”在
这是我目前正在学习的系统编程类(class)的幻灯片: catch_child 是 SIGCHLD 处理程序。输出与代码如何对应?为什么没有打印一些“Child #x started”消息? 最佳答案
这有点像拼图……我刚刚又回到了C,打算这次掌握它。所以我一直在阅读 The C Programming Language ,我得到了这个声明: Among others, printf also re
如何使用 printf 在字符串末尾附加空格? 我找不到任何在右侧附加空格的示例。 A similar question我发现使用 printf改为在字符串的左侧添加空格。 最佳答案 使用负数左对齐(
我想通过 usart 从 stm32f405 注销。 在我的 syscall.c 文件中,我实现了通过 usart 打印的功能: int _write(int file, char *ptr, int
我想定义一个记录器函数,比如 myPutStrLn = putStrLn . (++) "log: " main = do myPutStrLn "hello" 这很好。现在我想用 printf 格式
Printf module API详细介绍了类型转换标志,其中: %B: convert a boolean argument to the string true or false %b: conv
@H2CO3 这是我的主要代码: #pragma OPENCL EXTENSION cl_ amd_ printf : enable #define PROGRAM_FILE "matvec.cl"
Printf module API详细介绍了类型转换标志,其中: %B: convert a boolean argument to the string true or false %b: conv
您可以使用 printf 字段宽度说明符截断字符串: printf("%.5s", "abcdefgh"); > abcde 不幸的是,它不适用于数字(将 d 替换为 x 是相同的): printf(
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
我遇到了我见过的最奇怪的错误之一。 我有一个简单的程序,可以打印多个整数数组。 对数组进行排序,然后打印...... place_in_buf(n100, 100); insertion(10
我的程序是每隔一段时间获取文件大小并显示它以记录任何更改。由于某种原因,执行下面的代码挂起,只为我提供了一个光标。没有打印或显示任何内容。 代码: #include #include #inclu
printf("It is currently %s's turn.\n", current->name); 我想知道为什么在 %s 之后打印出额外的换行符。我知道C 中的字符串总是以\0 结尾。没有
这个问题已经有答案了: printf anomaly after "fork()" (3 个回答) fork() in c using printf [duplicate] (2 个回答) 已关闭 9
我对编程很陌生。 我正在尝试编写一个程序,从数组中调用水果的价格。但我希望代码在写价格之前也写水果的名称。如果我键入 2,如何使输出为“Orange price : 10”而不仅仅是 price :
这个问题在这里已经有了答案: How do I print a non-null-terminated string using printf? (2 个答案) 关闭 7 年前。 例如,我有一个字符
我有一个 atmel UC3-L0 和罗盘传感器。现在我安装 AtmelStudio 并将一些演示代码下载到电路板中。但是我不知道演示代码中的函数 printf 会在哪里出现数据。我应该如何获取数据?
我有一个 atmel UC3-L0 和罗盘传感器。现在我安装 AtmelStudio 并将一些演示代码下载到电路板中。但是我不知道演示代码中的函数 printf 会在哪里出现数据。我应该如何获取数据?
嗨,我是 C 世界的新手,我的代码确实有些奇怪。目标是创建一个函数,可以在开头和结尾处用空格和/或制表符修剪字符串。我无法使用字符串库。 问题是我的代码中有一个 printf 只是用于测试,它的工作非
我是一名优秀的程序员,十分优秀!