Где я могу найти все индикаторы десятичного типа C ++? - PullRequest
6 голосов
/ 09 апреля 2019

Где я могу найти все индикаторы десятичного типа C ++, такие как

long l = 0L;

Я также знаю L U f d. Есть ли другие? Где я могу найти их всех? Как явно указать неподписанный шорт?

Ответы [ 4 ]

7 голосов
/ 09 апреля 2019

Этот индикатор, на который вы ссылаетесь, называется суффиксом .

Для целочисленных типов существует два типа суффиксов:

  1. беззнаковый суффикс - символ u или символ U
  2. длинный суффикс - символ l или символ L или длинный-длинный суффикс - последовательность символов ll или последовательность символов LL.

Для целочисленных литералов вы можете комбинировать эти суффиксы, такие как ul или ull, чтобы получить и "unsignednes" и "longness" в одном и том же литерале.

Существуют также суффиксы для типов с плавающей запятой: один из f, F, l или L

  1. Без суффикса литерал определяет double
  2. f или F определяет float
  3. l или L определяет long double

Существуют также пользовательские литералы, для которых вы можете ввести пользовательские суффиксы.

Что касается вашего второго вопроса о unsigned short: явного суффикса для short не существует, поэтому вам придется использовать static_cast или приведение в стиле C.

Другой способ сделать это - определить пользовательский литеральный оператор , например,

unsigned short operator "" _ush(unsigned long long int a)
{
    return static_cast<unsigned short>(a);
}

А затем используйте его для определения литералов следующим образом: unsigned short a = 123_ush;

Я проверил, что это работает, используя этот фрагмент:

#include <iostream>
#include <string>
#include <typeinfo>

unsigned short operator "" _ush(unsigned long long int a)
{
    return static_cast<unsigned short>(a);
}

int main()
{
  std::string name;
  bool equal = typeid(decltype(123_ush)) == typeid(unsigned short); // check that literal is indeed unsigned short
  std::cout << equal;
}

Для получения дополнительной информации о вещах, упомянутых в моем ответе, я бы предложил проверить cppreference: Целочисленные литералы , Литерал с плавающей точкой , Пользовательский литерал

4 голосов
/ 09 апреля 2019

Вы не можете. В C ++ нет такой вещи как литерал unsigned short или short.

Вам необходимо использовать static_cast.

Ссылка: https://en.cppreference.com/w/cpp/language/integer_literal

1 голос
/ 09 апреля 2019

короткий список:

1.0 => double
1.0f => float
1 => int
1U => unsigned int
1L => long
1UL => unsigned long
1ULL => unsigned long long
1LL => long long

Вот хорошая документация для префиксов и суффиксов : https://www.geeksforgeeks.org/integer-literal-in-c-cpp-prefixes-suffixes/

0 голосов
/ 09 апреля 2019

Вы можете найти полный список встроенных буквенных аффиксов в lex.literal .

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


Целочисленные суффиксы из lex.icon / 2 :

  • (без суффикса)
  • u или U
  • l или L
  • Оба u или U и l или L
  • ll илиLL
  • Обе u или U и ll или LL

Какой именно тип обозначается этими символами, зависит от величины буквального значения, но есливы заглянете в таблицу 7 , вы обнаружите, что нет никаких суффиксов, которые дадут вам unsigned short из коробки.


Для полноты здесь с плавающей запятойсуффиксы из lex.fcon :

  • Любой из f, l, F, L.

f / F указывают float, l / L указывают long double.Отсутствие суффикса означает double.

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