std::numeric_limits<T>::digits
static const int digits; | (до C++11) | |
static constexpr int digits; | (начиная с C++11) |
Значение std::numeric_limits<T>::digits — это количество цифр в системе счисления с основанием radix, которое может быть представлено типом T без изменений. Для целочисленных типов это количество битов без учёта бита знака и битов заполнения (если они есть). Для типов с плавающей точкой это количество цифр мантиссы (для реализаций IEC 559/IEEE 754 — количество цифр, хранящихся для мантиссы, плюс один, поскольку мантисса имеет неявную ведущую единицу и двоичную точку).
Стандартные специализации
T | значение std::numeric_limits<T>::digits(при отсутствии битов заполнения) |
|---|---|
| /* non-specialized */ |
0 |
| bool |
1 |
| char |
CHAR_BIT - std::numeric_limits<char>::is_signed |
| signedchar |
CHAR_BIT - 1 |
| unsignedchar |
CHAR_BIT |
| wchar_t |
CHAR_BIT * sizeof(wchar_t)
- std::numeric_limits<wchar_t>::is_signed
|
| char8_t (начиная с C++20) |
CHAR_BIT |
| char16_t (начиная с C++11) |
CHAR_BIT * sizeof(char16_t) |
| char32_t (начиная с C++11) |
CHAR_BIT * sizeof(char32_t) |
| short |
CHAR_BIT * sizeof(short) - 1 |
| unsignedshort |
CHAR_BIT * sizeof(short) |
| int |
CHAR_BIT * sizeof(int) - 1 |
| unsignedint |
CHAR_BIT * sizeof(int) |
| long |
CHAR_BIT * sizeof(long) - 1 |
| unsignedlong |
CHAR_BIT * sizeof(long) |
| longlong (начиная с C++11) |
CHAR_BIT * sizeof(long long) - 1 |
| unsignedlonglong (начиная с C++11) |
CHAR_BIT * sizeof(long long) |
| float |
FLT_MANT_DIG |
| double |
DBL_MANT_DIG |
| longdouble |
LDBL_MANT_DIG |
Пример
#include <concepts>
#include <iomanip>
#include <iostream>
#include <limits>
#include <meta>
#include <string_view>
#include <type_traits>
using namespace std::literals;
template<typename T>
requires std::integral<T> or std::floating_point<T>
constexpr void digit()
{
constexpr int w{(int)"unsigned long long"sv.size()};
std::cout << std::right << std::setw(w)
<< std::meta::display_string_of(^^T) << " : "
<< std::numeric_limits<T>::digits << '\n';
}
template<typename... T>
constexpr void digits()
{
(digit<T>(), ...);
}
int main()
{
digits<
bool, char, signed char, unsigned char, wchar_t, char8_t, char16_t,
char32_t, short, unsigned short, int, unsigned int, long, unsigned long,
long long, unsigned long long, float, double, long double
>();
}
Возможный вывод:
bool : 1
char : 7
signed char : 7
unsigned char : 8
wchar_t : 31
char8_t : 8
char16_t : 16
char32_t : 32
short : 15
unsigned short : 16
int : 31
unsigned int : 32
long : 63
unsigned long : 64
long long : 63
unsigned long long : 64
float : 24
double : 53
long double : 64
См. также
|
[static] | основание системы счисления или целочисленное основание, используемое в представлении данного типа (общедоступная статическая константа-член) |
|
[static] | на единицу больше наименьшей отрицательной степени основания, которая является допустимым нормализованным значением с плавающей точкой (общедоступная статическая константа-член) |
|
[static] | на единицу больше наибольшей целочисленной степени основания, которая является допустимым конечным значением с плавающей точкой (общедоступная статическая константа-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/numeric_limits/digits