我想知道我的time_t
可以容纳的最大值是什么,所以我写了一个小程序来帮助我。它需要一个参数:字节数(1字节= 8位)。所以我写了它并测试了它。它从1直到4的所有值都很顺利,但在5和更高时它也编辑了“签名”位(我不知道它是如何调用的)。有人可以解释一下:
#include <stdio.h>
int main(int argc, const char **argv) {
if(argc != 2) {
fprintf(stderr, "Usage: %s bits/8\n", argv[0]);
return -1;
}
unsigned int bytes;
sscanf(argv[1], "%u", &bytes);
unsigned int i;
signed long long someInt = 0;
size_t max = bytes*8-1;
for(i = 0; i < max; i++) {
someInt |= 1 << i;
}
/* Print all bits, we substracted
1 to use in the previous loop so
now we add one again */
max++;
for(i = 0; i < max; i++) {
int isAct = (someInt >> max-i-1) & 1;
printf("%d", isAct);
if((i+1) % 8 == 0) {
printf(" ");
}
}
printf("\n");
printf("Maximum size of a number with %u bytes of 8 btis: %lld\n", bytes, (long long)someInt);
return 0;
}
我的测试:
Script started on Sun Jan 30 16:34:38 2011
bash-3.2$ ./a.out 1
01111111
Maximum size of a number with 1 bytes of 8 btis: 127
bash-3.2$ ./a.out 2
01111111 11111111
Maximum size of a number with 2 bytes of 8 btis: 32767
bash-3.2$ ./a.out 4
01111111 11111111 11111111 11111111
Maximum size of a number with 4 bytes of 8 btis: 2147483647
bash-3.2$ ./a.out 5
11111111 11111111 11111111 11111111 11111111
Maximum size of a number with 5 bytes of 8 btis: -1
bash-3.2$ ./a.out 8
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
Maximum size of a number with 8 bytes of 8 btis: -1
bash-3.2$ exit
exit
Script done on Sun Jan 30 16:35:06 2011
我希望从这个中学习,所以如果有人能抽出时间看看这个,我真的很感激。
ief2
答案 0 :(得分:1)
您只使用int
,即1
进行轮班操作。此
someInt |= 1LL << i;
我想,会做得更好。
通常我无法知道有一个有符号整数类型的最大值,你只有一个typedef,而不会冒未定义行为或编译器和平台特定属性的风险。例如,<<
运算符可能在签名类型上存在问题。
time_t
特别奇怪,因为它可能是浮点类型或整数类型。如果它是一个整数,则不指定它是否有符号。
如果您认为它是有符号整数类型和,您没有所谓的填充位(大多数平台符合这一点),则可以直接计算最大值
((((1LL << (sizeof(time_t)*CHAR_BIT-2)) - 1) << 1) + 1)
没有溢出。