Как предсказать размер определенного типа данных в C? - PullRequest
0 голосов
/ 24 марта 2011

Я знаю, что размер типов данных в C установлен не для всех архитекторов.

Но для фиксированного процессора ЦП, как я могу предсказать размер sizeof(unsigned short)?

Под прогнозируем Я имею в виду не по тесту (printf("%d",sizeof(unsigned short));)

Ответы [ 5 ]

3 голосов
/ 24 марта 2011

Прочитайте документацию вашего компилятора.

1 голос
/ 14 марта 2012

Используйте взамен uint16_t - это гарантировано, что stdint.h будет точно 16-битным или предотвратит компиляцию, если в архитектуре невозможно 16-битное значение.

Если вы просто хотите проверить, рассмотрите возможность использования C_ASSERT (sizeof (T) == 2) - это вызовет ошибку времени компиляции, если T имеет значение , а не 2 байта. Таким образом, вы можете знать, что T имеет длину 2 байта в каждом скомпилированном двоичном файле (поскольку, если бы это было не по какой-то странной причине компилятора, сборка не удалась бы).

1 голос
/ 25 марта 2011

Если вы хотите иметь согласованные, предсказуемые размеры для ваших типов данных, вам не следует использовать short, int, long и т. Д. Стандарт C99 ввел стандартные типы для указания целых чисел точной ширины. Включите заголовок stdint.h , чтобы получить доступ к таким типам, как uint16_t и int64_t для 16-разрядных целых чисел без знака и 64-разрядных со знаком соответственно, независимо от архитектуры, на которой вы работаете.

1 голос
/ 24 марта 2011

Вы не можете «предсказать» размер в байтах, но вы можете «предсказать» диапазон:

#include <limits.h>

#if USHRT_MAX < 65535
/* less than the minimum guaranteed by the Standard: will never happen */
#elif USHRT_MAX == 65535
/* minimum guaranteed by the Standard: 2 8-bit bytes */
#elif USHRT_MAX <= 420042
/* a little more room than guaranteed by the Standard */
#elif USHRT_MAX <= 2000000000
/* a lot more room than guaranteed by the Standard */
#else
/* 640K ought to be enough for anybody */
#endif
1 голос
/ 24 марта 2011

вы либо читаете документацию по компилятору, либо пишете программу, которую можете запустить на архитектуре / компиляторе, о котором вы хотите собрать информацию:

/* $Id: sizeof.c,v 1.1 2009/07/05 10:37:54 sms Exp $
 * www.pccl.demon.co.uk
 * Program to display data sizes. */

#include    <stdio.h>
#include    <time.h>
#include    <sys/types.h>

#define printsize(x)    printf ("sizeof (" #x ")    = %d\n", sizeof (x))

main ()
{
    printf ("\nC\n");
    printsize (char);
    printsize (double);
    printsize (float);
    printsize (int);
    printsize (long);
    printsize (long long);
    printsize (short);
    printsize (void *);

    printf("\n");
    printsize (clock_t);
    printsize (gid_t);
    printsize (pid_t);
    printsize (size_t);
    printsize (ssize_t);
    printsize (time_t);
    printsize (uid_t);
}

http://www.pccl.demon.co.uk/C/sizeof.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...