Am Monday 26 November 2012 schrieb Ángel González: > On 26/11/12 00:04, Giuseppe Scrivano wrote: > > that is a good idea, we can add something like: > > > > #define MAX_INT_TO_STRING_LEN(x) (sizeof(x) * 24082 / 10000) + 2 > > > > where `x' in our case will be off_t. > > > > I am not sure if such a function already exists somewhere. > > > > Does it improve readability? > > Well, that just brings the question «Where does 24082 come from?» but if > that used for eg.
simply said (well, not simply - it had to refresh my knowledge ;-) sizeof(x) = log256(max(x)) => sizeof(x) = log10(max(x)) / log10(256) => sizeof(x) * log10(256) = log10(max(x)) [log10(max(x)) is what we need !] => sizeof(x) * log10(256) = log10(max(x)) => sizeof(x) * 2,4082... = log10(max(x)) ~= sizeof(x) * 24082 / 10000 = log10(max(x)) and for completeness: plus one for trailing \0 and plus one for the sign But why so complicated ? 32 is a good value even for 64bit and aligns succeeding memory to a 16 byte boundary. If you want to save memory, you could calculate the needed size replacing max(x) by your value and make a inline function out of MAX_INT_TO_STRING_LEN - ok, but then you need the C99 feature 'variable length arrays' ;-) MAX_INT_TO_STRING_LEN should be renamed to make clear that we are talking about converting int to a DECIMAL string, e.g. MAX_INT_TO_DEC_LEN. Regards, Tim
