Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
2729 / 884 / 330
Регистрация: 10.02.2018
Сообщений: 2,093

Целочисленная 64х битная константа из символов

17.03.2025, 14:21. Показов 3691. Ответов 20

Студворк — интернет-сервис помощи студентам
C++
1
uint64_t itemID = "item1234"; // естественно, что так не работает
Хочется использовать в коде целочисленные константы состоящие из символов. Чтобы объявление констант было простым и наглядным. Можно ли это как-то реализовать стандартными средствами языка, что бы не очень сложно выглядело?

C++
1
int itemID = 'gr01';
Есть что-то подобное для 4 байт ("multi-character literal", вроде называется), но хочется распространить это на 8 байт.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.03.2025, 14:21
Ответы с готовыми решениями:

Каждый символ строки записать в целочисленный массив
char to int Здравствуйте. Вопрос, простой. У меня есть строка "123456789" Мне нужно каждый символ из этой строки записать в...

Задачи из книги Прата (представить значения с помощью символических констант)
Только начал изучать книгу Прата "Язык программирования С++",столкнулся с такой задачей: Напишите программу, которая запрашивает широту в...

Вывести слово с помощью символьных констант
помогите написать программу: Вывести слово с помощью символьных констант.

20
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6089 / 2780 / 1037
Регистрация: 01.06.2021
Сообщений: 10,138
17.03.2025, 14:47
Цитата Сообщение от Ygg Посмотреть сообщение
Есть что-то подобное для 4 байт
это implementation defined, соответственно, бесполезная штука

The value of an integer character constant containing more than one character (e.g., 'ab'), […] is implementation-defined.
Тебе нужно написать, о какой реализации идет речь...
1
2729 / 884 / 330
Регистрация: 10.02.2018
Сообщений: 2,093
17.03.2025, 15:20  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Тебе нужно написать, о какой реализации идет речь...
Без понятия про реализацию. Пока придумал только заранее получить по строке эквивалентное значение целого, написать это целое в объявлении целочисленной переменной, а в комментарии к строке написать текстовый вариант.
C++
1
uint64_t id = 0x343332316d657469; // "item1234"
Идея в том, что бы, с одной стороны, использовать в программе строковый идентификатор объектов, по которому в отладчике можно визуально легко догадаться о его назначении. С другой стороны, хочется оперировать идентификаторами, как обычными целыми числами, а не как строками.
0
Заблокирован
17.03.2025, 17:37
Лучший ответ Сообщение было отмечено Ygg как решение

Решение

Ygg, создать пользовательский литерал?

Хотя, если хочется двойного поведения, то наверное собственный класс с приведениями типов.

Покажите как желаете использовать вашу переменную в обеих случаях.

Добавлено через 25 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
создать пользовательский литерал?
Пример литерала :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdint>
 
constexpr std::uint64_t operator""_bs8(const char* value,  std::size_t length){
   std::uint64_t ret{0};
   for(size_t i = 0; i != length; ++i){
      ret >>= 8;
      ret |= std::uint64_t(value[i]) << ((sizeof(std::uint64_t) - 1) * 8);
   }
   return ret;
}
int main(){
   auto v = "item1234"_bs8;
   std::cout << std::hex << v << std::endl; // 0x343332316d657469
}
1
2729 / 884 / 330
Регистрация: 10.02.2018
Сообщений: 2,093
17.03.2025, 17:56  [ТС]
SmallEvil, да, именно чего-то подобного и хотелось, спасибо.

Добавлено через 3 минуты
Хотя, наверное, можно и без литерала сделать подобное, через constexpr-функцию принимающую строку и возвращающую число.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6089 / 2780 / 1037
Регистрация: 01.06.2021
Сообщений: 10,138
17.03.2025, 18:37
полагаю, можно упростить
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
1
ret |= std::uint64_t(value[i]) << ((sizeof(std::uint64_t) - 1) * 8);
C++
1
ret |= std::uint64_t(value[i]) << 56;
0
Заблокирован
17.03.2025, 18:46
Цитата Сообщение от Royal_X Посмотреть сообщение
полагаю, можно упростить
Такое себе упрощение, я специально так сделал для задела под шаблон с CHAR_BIT.
Да можно и memcpy, если правильно подойти.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6089 / 2780 / 1037
Регистрация: 01.06.2021
Сообщений: 10,138
17.03.2025, 18:53
SmallEvil, а длину проверять не нужно?

Цитата Сообщение от SmallEvil Посмотреть сообщение
я специально так сделал для задела под шаблон с CHAR_BIT
CHAR_BIT != 8 в 2025 году сложно найти, нужно очень постараться и на таких редких системах вроде std::uint64_t не будет работать
0
Заблокирован
17.03.2025, 19:04
Цитата Сообщение от Royal_X Посмотреть сообщение
SmallEvil, а длину проверять не нужно?
Спроси у ТС.

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
CHAR_BIT != 8 в 2025 году сложно найти, нужно очень постараться
Это не столь важно, магические числа нужно сводить к минимуму.
Ты придраться решил? Так всегда есть за что. )
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6089 / 2780 / 1037
Регистрация: 01.06.2021
Сообщений: 10,138
17.03.2025, 19:09
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ты придраться решил? Так всегда есть за что. )
ні, просто когда вижу интересный код, я его начинаю разбирать на куски, как учил Декарт в Discours de la méthode pour bien conduire sa raison, et chercher la verité dans les sciences. И вот в процессе возникают какие-то вопросы, вот и задаю) а иногда предлагаю что-то, если кажется, что так будет лучше
0
Заблокирован
17.03.2025, 20:34
Про шаблон, это я поторопился. Он тут неуместен.
Скорее, хотелось создать код-шаблон для перегрузок.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstdint>
#include <climits>
#include <limits>
#include <type_traits>
#include <iomanip>
 
constexpr std::uint64_t operator""_as_int(const char* value,  std::size_t length){
   using T = std::uint64_t;
   using char_type = decltype(*value);
   T ret{0};
   static_assert( (sizeof(T) >= sizeof(char_type)) &&
                  (sizeof(T) % sizeof(char_type) == 0));
   for(size_t i = 0; i != length; ++i){
      ret >>= sizeof(char_type)*CHAR_BIT;
      ret |= std::uint64_t(value[i]) << ((sizeof(T) - sizeof(char_type)) * CHAR_BIT);
   }
   return ret;
}
constexpr std::uint64_t operator""_as_int(const wchar_t* value,  std::size_t length){
   using T = std::uint64_t;
   using char_type = decltype(*value);
   static_assert( (sizeof(T) >= sizeof(char_type)) &&
                  (sizeof(T) % sizeof(char_type) == 0));
   T ret{0};
   for(size_t i = 0; i != length; ++i){
      ret >>= sizeof(char_type)*CHAR_BIT;
      ret |= std::uint64_t(value[i]) << ((sizeof(T) - sizeof(char_type)) * CHAR_BIT);
   }
   return ret;
}
int main(){
   {
      auto v = "item1234"_as_int;
      std::cout << std::hex <<  std::setw(sizeof(v)*2) << std::setfill('0') << v << std::endl; // 0x343332316d657469
   }
   {
      auto v = L"12"_as_int;
      std::cout << std::hex << std::setw(sizeof(v)*2) << std::setfill('0') << v << std::endl; // 0x0000003200000031 // sizeof(wchar_t) = 4 
   }
}
Возможно описать одним шаблоном, именно для литерала?

Добавлено через 8 минут
Тогда просто вынести тело в отдельную функцию-шаблон и вызвать в перегрузках литералов.
0
Модератор
Эксперт С++
 Аватар для zss
13765 / 10960 / 6489
Регистрация: 18.12.2011
Сообщений: 29,233
17.03.2025, 21:10
Есть же union
C
1
2
3
4
5
6
7
8
9
10
11
12
 union X
{
     char c[4];
     int n;
};
 
int main()
{
    X x={'a','b','c','d'};
    printf("%x",x.n);
    return 0;
}
Жаль, что нельзя так
C
1
    X x="abcd";
т.к. "abcd" строка из 5 байт.

Можно, конечно, добавить один байт, но он будет вне переменной n
C
1
2
3
4
5
6
7
8
9
10
11
12
13
 #define uint64_t long long
 union X
{
     char c[9];
     uint64_t n;
};
 
int main()
{
    X x={"abcd1234"};
    printf("%llx",x.n);
    return 0;
}
0
Заблокирован
17.03.2025, 22:07
Цитата Сообщение от zss Посмотреть сообщение
Есть же union
Да, это хорошо. Но это не тоже самое что просто целочисленный тип.

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
x.n
это просто жесть, не говоря о том что ещё остается доступное с.
И потом догадайся что это и для чего)
Нет, со всем уважением, union тут не подходит.
1
Модератор
Эксперт С++
 Аватар для zss
13765 / 10960 / 6489
Регистрация: 18.12.2011
Сообщений: 29,233
17.03.2025, 22:24
SmallEvil, от x.n можно избавиться с помощью перегрузок.

И, кстати, вполне здравая идея - разработать отдельный класс под эту задачу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <iomanip>
using namespace std;
#define uint64_t long long
union X
{
private:
    char c[9];
    uint64_t n;
public:
    X(char* txt){n=0;strncpy(c,txt,8);}
    X(int n=0):n(n){}
    //void Set(char* txt){strncpy(c,txt,8);}
    //void Set(int n){this->n=n;}
    friend ostream& operator<<(ostream& os,X& x);
    friend istream& operator>>(istream& is,X& x);
};
ostream& operator<<(ostream& os,X& x)
{
    os<<x.n;
    return os;
}
istream& operator>>(istream& is,X& x)
{
    is.getline(x.c,9);
    return is;
}
int main()
{
    X x="abcd1234";
    cout<<hex<<x<<endl;
    cin>>x;
    cout<<hex<<x;
    return 0;
}
Так что, если ТС понравится, то вполне может использовать.
1
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,865
17.03.2025, 23:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    char val[] = "SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);";
    int64_t next_val{};
 
strcpy((char*)&next_val, val);
 
printf("\n%lld\n", next_val);
 
printf("\n%s", (char*)&next_val);
 
getchar();
    return 0;
}
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,865
18.03.2025, 00:01


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdint.h>
#include <string.h>
 
int main()
{
    int64_t next_val{};
 
strcpy((char*)&next_val, "SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);");
 
printf("\n%lld\n", next_val);
 
printf("\n%s", (char*)&next_val);
 
    return 0;
}
C++
1
2
memcpy(&next_val ,"SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);",
    strlen("SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);"));
0
Заблокирован
18.03.2025, 00:21
Цитата Сообщение от Наталья8 Посмотреть сообщение
strcpy((char*)&next_val, val);
Это что за говно?
Пишем в next_val всю строку?

"Лучше уж сразу застрелится, чем медленно отстреливать себе конечности."
1
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,865
18.03.2025, 02:49
Цитата Сообщение от SmallEvil Посмотреть сообщение
Пишем в next_val всю строку?
Да можно и не всю.
Есть несколько подобных функций.
strncpy() например.
Задачи какие то странные, должны быть такие же ответы.
А то кислотно щелочной баланс нарушиться.
Спасибо за внимание.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,865
18.03.2025, 02:59
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,865
18.03.2025, 03:14
Пардон... Восемь букоф и без нультерминатора.
Можно семь, но с нулём...
C++
1
2
3
4
5
6
7
8
9
int main()
{
    int64_t next_val{};
 
strncpy((char*)&next_val, "Hello wo", 8);
 
printf("\n%lld\n", next_val);
 
printf("\n%s", (char*)&next_val);
А я туда 62 загнал....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2025, 03:14
Помогаю со студенческими работами здесь

Сделать массив констант, содержащий символы от '0' до '9' и от 'A' до 'Z'
Как в С++ сделать массив констант, содержащий символы от 0 до 9 и от A до Z

Хранение конфигурационных целочисленных констант
Как известно при написании программ с использованием системных функций очень часто приходится применять константы в качестве значений опций...

Есть ли в std, или где-нибудь ещё, константа для пустой строки (""), как endl (\n) для символа переноса?
Раздражает писать так: return &quot;&quot;;

Какое число выводится при преобразовании символа ‘A’ к целочисленному типу?
Какое число выводится при преобразовании символа ‘A’ к целочисленному типу? Почему именно такое число?

String добавляет лишние символы к константе
Имеется такой код: String a = &quot;buffer.dat&quot;; В отладчике он выглядит так: a: {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru