小编And*_*Chi的帖子

为什么time()不调用系统调用?

当我"strace"以下C程序时,time()不会调用系统调用.

#include <time.h>
int main() {
  return (int)time(NULL);
}
Run Code Online (Sandbox Code Playgroud)

为什么不?它从哪里获得时间?这是Ubuntu 12.04上的完整strace输出.

$ gcc -Wall -o testtime testtime.c && strace ./testtime
execve("./testtime", ["./testtime"], [/* 34 vars */]) = 0
brk(0)                                  = 0x11f1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd6e052f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=38828, ...}) = 0
mmap(NULL, 38828, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd6e0525000
close(3)                                = 0 …
Run Code Online (Sandbox Code Playgroud)

c linux time system-calls

10
推荐指数
1
解决办法
219
查看次数

C解释十六进制长整数字"L"

考虑到自动转换,C编译器如何解释表示长整数文字的"L"?以下代码在32位平台(32位长,64位长)上运行时,似乎将表达式"(0xffffffffL)"转换为64位整数4294967295,而不是32位-1.

示例代码:

#include <stdio.h>

int main(void)
{
  long long x = 10;
  long long y = (0xffffffffL);
  long long z = (long)(0xffffffffL);

  printf("long long x == %lld\n", x);
  printf("long long y == %lld\n", y);
  printf("long long z == %lld\n", z);

  printf("0xffffffffL == %ld\n", 0xffffffffL);

  if (x > (long)(0xffffffffL))
    printf("x > (long)(0xffffffffL)\n");
  else
    printf("x <= (long)(0xffffffffL)\n");

  if (x > (0xffffffffL))
    printf("x > (0xffffffffL)\n");
  else
    printf("x <= (0xffffffffL)\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出(在32位Debian上使用GCC 4.5.3编译):

long long x == 10
long long y == …
Run Code Online (Sandbox Code Playgroud)

c 64-bit casting 32-bit long-integer

1
推荐指数
1
解决办法
4207
查看次数

标签 统计

c ×2

32-bit ×1

64-bit ×1

casting ×1

linux ×1

long-integer ×1

system-calls ×1

time ×1