I wanted to know what the maximum value my time_t
can hold was, so I wrote a little program helping me. It needs one argument: the amount of bytes (1 byte = 8 bits). So I wrote it and tested it. It goes well by all values from 1 untill 4, but at 5 and higher it also edits the "signed"-bit (I don't know how it's called). Can someone explain:
#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;
}
My testing:
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
I'm hoping to learn from this one, so I'd really appreciate it if someone can find some time to take a look at this.
ief2
You are only using an int
, namely 1
, for your shift operation. This
someInt |= 1LL << i;
would do better, I think.
Generally there is no way that I know of to have the maximum value of a signed integer type of which you only have a typedef without risking undefined behavior or compiler and platform specific properties. E.g the <<
operator may have problems on signed types.
time_t
is particularly odd since it might be a floating point type or an integer type. And if it is an integer it is not specified if it is signed or not.
If you suppose that it is a signed integer type and that you don't have so-called padding bits (most platforms conform to that) the maximum value can be computed directly
((((1LL << (sizeof(time_t)*CHAR_BIT-2)) - 1) << 1) + 1)
without having overflows.