Есть ли гарантия, что для каждого скаляра `T` существует целое число того же размера?

Если T является скалярным типом, а N = CHAR_BIT * sizeof(T) гарантируется ли существование uintN_t? Если нет, верно ли это в большинстве случаев, но с несколькими исключительными типами случаев? ( long double и указатели функций-членов приходят на ум. )

Для справки:

  • intN_t, uintN_t

    • N1548 §7.20.1.1 ¶3: "These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two’s complement representation, it shall define the corresponding typedef names."
  • scalar types

    • N3242 §3.9 ¶9: "Arithmetic types, enumeration types, pointer types, pointer to member types, std::nullptr_t, and cv-qualified versions of these types are collectively called scalar types."

person Charles L Wilcox    schedule 24.11.2013    source источник
comment
Я не могу понять, в чем вопрос. Что для вас скалярный?   -  person David Rodríguez - dribeas    schedule 25.11.2013
comment
@DavidRodríguez-dribeas Тогда прочитайте стандарт C.   -  person    schedule 25.11.2013
comment
Почему вы думаете, что такая вещь может существовать? Существуют inttypes.h (C99) и cinttypes (эквивалент C++), которые содержат аналогичные определения, но эти стандарты гарантируют только до uint64_t. И что означает большинство случаев? 64 = 2 ^ 6, а в 32-битной системе, я думаю, теоретически у вас может быть целое число размера 2 ^ 32, поэтому НЕТ, в большинстве случаев это неверно.   -  person Apprentice Queue    schedule 25.11.2013
comment
@DavidRodríguez-dribeas N3242 §3.9 ¶9: Арифметические типы, типы перечисления, типы указателей, указатели на типы-члены, std::nullptr_t и версии этих типов с указанием cv вместе называются скалярными типами.   -  person Charles L Wilcox    schedule 25.11.2013
comment
Ответ: нет. Я построил совместимую реализацию C, которая использует 1024-битные целые числа, а стандарт не определяет тип uint1024_t. Я бы разместил всю реализацию прямо здесь, но она не помещается в этом поле комментария...   -  person peppe    schedule 25.11.2013


Ответы (2)


Типы uintX_t необязательны, поэтому нет гарантии, что они вообще будут в вашей реализации. Кроме этого, нет точного определения того, что для вас означает скаляр.

person David Rodríguez - dribeas    schedule 24.11.2013
comment
Арифметические типы и типы указателей вместе называются скалярными типами (C99 6.2.5.21). - person ; 25.11.2013
comment
N1548 §7.20.1.1 ¶3: Эти типы являются необязательными. Однако, если реализация предоставляет целочисленные типы шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком) с представлением в дополнительном коде до двух, она должна определить соответствующие имена typedef. - person Charles L Wilcox; 25.11.2013
comment
N3242 §3.9 ¶9: Арифметические типы, типы перечисления, типы указателей, указатели на типы-члены, std::nullptr_-t и версии этих типов с указанием cv вместе называются скалярными типами. - person Charles L Wilcox; 25.11.2013
comment
@CharlesLWilcox: В любом случае ответ остается неизменным, по крайней мере, в C++ все эти типы являются необязательными, поэтому вы не можете полагаться на их существование. - person David Rodríguez - dribeas; 25.11.2013

Многие процессоры и/или компиляторы реализуют типы на long double больше, чем любой целочисленный тип, независимо от имени, и есть процессоры с 32 байтовыми указателями.

So, no.

person jthill    schedule 24.11.2013