Похоже на возможность выпечки! Вот результаты, которые я получаю от четырех различных размеров номера:
A = (sizeof(x) * 2.56 + 0.5) + 1
B = (sizeof(x) * 2.41) + 1
C = (sizeof(x) * 2.41 + 1.65)
strlen A B C Number (bytes)
4 4 3 4 -127 (1)
6 6 5 6 -32767 (2)
11 11 10 11 -2147483647 (4)
20 21 20 20 -9223372036854775807 (8)
Престижность user3386109. Все эти схемы пытаются оценить максимально возможную длину, а не фактическую длину (т. Е. Им не важно, какое значение «х» содержит). Ниже приведен код, который я использовал для создания приведенной выше таблицы. Я не включил long long
, так как на моей системе он имеет тот же размер, что и long
.
#include <stdio.h>
#include <string.h>
#define decimal_length1(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1)
#define decimal_length2(x) ((int)(sizeof(x) * 2.41) + 1)
#define decimal_length3(x) ((int)(sizeof(x) * 2.41 + 1.65))
int main() {
char buffer[1024];
char a = -127;
short b = -32767;
int c = -2147483647;
long int d = -9223372036854775807L;
printf("A = (sizeof(x) * 2.56 + 0.5) + 1\n");
printf("B = (sizeof(x) * 2.41) + 1\n");
printf("C = (sizeof(x) * 2.41 + 1.65)\n\n");
printf("strlen\tA\tB\tC\tNumber (bytes)\n\n");
sprintf(buffer, "%hhd", a);
printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(a), decimal_length2(a), decimal_length3(a), buffer, sizeof(a));
sprintf(buffer, "%hd", b);
printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(b), decimal_length2(b), decimal_length3(b), buffer, sizeof(b));
sprintf(buffer, "%d", c);
printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(c), decimal_length2(c), decimal_length3(c), buffer, sizeof(c));
sprintf(buffer, "%ld", d);
printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(d), decimal_length2(d), decimal_length3(d), buffer, sizeof(d));
return 0;
}
«Почему что-то разработанное таким образом» обычно не отвечает на StackOverflow, потому что только автор может дать окончательный ответ. –
Я предполагаю, что это используется для вычисления максимального количества символов, необходимых для печати целого числа со знаком данного типа. Ваши рассуждения верны. Но пока вычисление дает правильный ответ, когда 'sizeof (x)' равно 1, 2, 4 или 8, тогда это не имеет большого значения. –
Должно быть '((int) (sizeof (x) * 2.41 + 1.65))', чтобы получить правильный ответ от 8-битного до 128-битного. – user3386109