- 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/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!