Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153

snprintf x64

18.07.2021, 16:02. Показов 1623. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, почему 8 байтное число не записывается в массив char?

C++
1
2
3
INT64 value = 0x100FF00000000000;
TCHAR string[255];
snprintf(string, 255, "%i", value);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2021, 16:02
Ответы с готовыми решениями:

Не работает snprintf с va_list C++98
Хочу собрать функцию вывода на подобии printf, но немогу понять почему snprintf делает пустоту, хотя результат его > 0 const...

Где взять и как подцепить к Code Blocks бесплатный компилятор x64 стандарта C++11 для Windows 7 x64?
Где взять и как подцепить к Code Blocks бесплатный компилятор x64 стандарта C++11 для Windows 7 x64?

User32.dll на Win x64 - это x86-библиотека, x64 или. и то и другое одновременно?
В проектах .NET функции из нее нормально импортируются при любой разрядности проекта - как x86, так и x64. Как написать такую библиотеку?

19
124 / 44 / 15
Регистрация: 01.11.2020
Сообщений: 122
18.07.2021, 16:29
напишите в чем проблема
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
18.07.2021, 17:00
Rybik001, потому что формат для 64 разрядов другой. %i не подходит.
0
Заблокирован
18.07.2021, 17:19
%ll ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
18.07.2021, 17:25
Цитата Сообщение от Rybik001 Посмотреть сообщение
Подскажите, почему 8 байтное число не записывается в массив char?
Что такое INT64 и почему вы решили, что для него вообще есть формат в printf? Если это знаковый целый тип ширины 64, то, например

C++
1
snprintf(string, 255, "%" PRIi64, (std::int64_t) value);
Также не ясно, почему буфер объявлен как TCHAR.
0
Заблокирован
18.07.2021, 17:29
%llu/%llX
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
18.07.2021, 19:09  [ТС]
C++
1
snprintf(string, 255, "%I64i", value);
Нашел решение
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
19.07.2021, 16:50
Цитата Сообщение от Rybik001 Посмотреть сообщение
Нашел решение
...которое не работает.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <inttypes.h>
 
int main(){
  int64_t value=5000000000;
  char string[1000];
  snprintf(string, 255, "%I64i", value);
  printf("Rybik001: %s\n", string);
  snprintf(string, 255, "%" PRIi64, value);
  printf("TheCalligrapher: %s\n", string);
}
Code
1
2
3
4
$ gcc main.c
$ ./a.out 
Rybik001:                                                        705032704
TheCalligrapher: 5000000000
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.07.2021, 18:21
А чем плох
C++
1
  snprintf(string, 255, "%Li", value);
0
фрилансер
 Аватар для Алексей1153
6461 / 5663 / 1130
Регистрация: 11.10.2019
Сообщений: 15,079
19.07.2021, 18:29
а чем плох
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
  int64_t value=5000000000;
  std::cout<<std::to_string(value);
}
?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
19.07.2021, 19:11
Цитата Сообщение от TRam_ Посмотреть сообщение
А чем плох
C++
1
  snprintf(string, 255, "%Li", value);
Ну хотя бы тем, что

1. Нет никакого "%Li". L применимо только к плавающим форматам.
2. Ни один из стандартных форматов printf не является применимым к "неизвестному" типу INT64. Пока никаких гарантий по поводу это типа нам не дано, любое решение будет требовать явного приведения к стандартному типу.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
19.07.2021, 21:22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"неизвестному" типу INT64
чем тебе INT64 неизвестен?
стандартное определение в стандартном хидере
C++
1
2
//basestd.h
typedef signed __int64 INT64, *PINT64;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
19.07.2021, 21:27
Цитата Сообщение от _lunar_ Посмотреть сообщение
стандартное определение в стандартном хидере
Во-первых, что это за "стандартный хидер" такой? Как называется?

Во-вторых, определен как синоним для signed __int64? __int64? А это что за загадочный тип? Тоже "стандартный"?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
19.07.2021, 21:35
TheCalligrapher, ну ты прям как в детском саду

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Как называется?
Windows.h

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А это что за загадочный тип?
C++
1
typedef signed long long INT64, *PINT64;
так проще?
https://docs.microsoft.com/ru-... w=msvc-160

по сабжу
C++
1
2
3
4
5
6
7
8
9
10
11
#include <Windows.h>
#include <stdio.h>
 
int main()
{
    INT64 value = 0x100FF00000000000;
    TCHAR string[255]{};
    snprintf(string, 255, "0x%llX", value);
 
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
20.07.2021, 00:13
Цитата Сообщение от _lunar_ Посмотреть сообщение
Windows.h
Ну то есть ничего "стандартного" в нем нет.

Цитата Сообщение от _lunar_ Посмотреть сообщение
C++
1
typedef signed long long INT64, *PINT64;
так проще?
Не понял. А это откуда? Так все таки определились: signed __int64 или signed long long? А то, что то я смотрю, семь пятниц на неделе.

Но это на самом деле не важно, ибо в это проблема и заключается. Стандартный тип, скрывающийся за INT64, не оговорен? Не оговорен. Значит либо

1. Тот самый windows.h предоставляет вместе с типом INT64 специальный формат для его использования в printf. Например, макрос, по аналогии с <inttypes.h>. Или, как тут уже приводили, объявляет нестандартный формат, вроде I64, если это именно для него.

либо

2. Ни о каком использовании INT64 в printf не может быть и речи.

Цитата Сообщение от _lunar_ Посмотреть сообщение
C++
1
2
3
    INT64 value = 0x100FF00000000000;
    TCHAR string[255]{};
    snprintf(string, 255, "0x%llX", value);
Нет. Еще раз, правильно:

C++
1
snprintf(string, 255, "%" PRIi64, (std::int64_t) value);
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
20.07.2021, 01:15
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну то есть ничего "стандартного" в нем нет.
ну конечно, Windows.h это совсем нестандартный хидер в винде и визуалке..
и применяется исключительно в нетривиальных задачах..

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А это откуда?
ссылку то открывал?
там же написано
The __int64 type is synonymous with type long long.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Стандартный тип, скрывающийся за INT64, не оговорен? Не оговорен.
я тебя вообще не понимаю
ты с другой планеты что ли?
что значит не оговорен?
любой здравомыслящий человек, открывая студию в винде, сразу подключает хидер Windows.h (один хидер на всё!)
после подключения я пишу INT64 и не знаю никаких проблем, о которых ты говоришь.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет. Еще раз, правильно:
какая разница как написать? если результат при этом один и тот же?
нет никакого правильно или неправильно, ЯП "эластичен" и позволяет делать вариации.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
20.07.2021, 02:41
Цитата Сообщение от _lunar_ Посмотреть сообщение
любой здравомыслящий человек, открывая студию в винде, сразу подключает хидер Windows.h (один хидер на всё!)
Чего? Нет, конечно, люди, "сразу подключающие хидер Windows.h", очевидно занимаются системно-специфичным программированием для Windows и обитают в соответствующем форуме. Но даже они не будут подключать Windows.h без явной на то необходимости.

Это же форум посвящен программированию на С++. Никто и никогда здесь ни в коме случае не подключает никакой Windows.h, даже открывая студию в винде. С чего бы это вдруг? За манеру "сразу подключать" подобный деятель сразу получит на лобешник штамп "овнокодера", линейкой по рукам и запрет подходить к коду на год.

Я "открываю студию в винде" уже не помню как давно. Однако мне никогда не приходилось подключать Windows.h, за редкими исключениями.

Цитата Сообщение от _lunar_ Посмотреть сообщение
после подключения я пишу INT64 и не знаю никаких проблем, о которых ты говоришь.
Получаешь, получаешь! Эта проблема называется "овнокод". Правда не все умеют его распознавать.

Для того, незнающий проблем вы наш, и существует хидер Windows.h, для того в нем и объявлен псевдоним INT64, чтобы вы НЕ знали, какой стандартный (и стандартный ли) тип за ним скрывается. И не лазили туда смотреть. В этом и заключается все назначение псевдонимов типов.

Любая синонимичность с long long, даже если она есть, является лишь мимолетным свойством конкретной реализации. Никакой синонимичности здесь, разумеется, быть не может, ибо INT64 явно должен обозначает тип фиксированной ширины (судя по названию), а long long типом фиксированной ширины не является в принципе.

Цитата Сообщение от _lunar_ Посмотреть сообщение
какая разница как написать? если результат при этом один и тот же?
См. выше.
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
20.07.2021, 10:47  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
ибо INT64 явно должен обозначает тип фиксированной ширины
Какой тип данных ты используешь для объявления 64 битной переменной?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
20.07.2021, 11:07
Rybik001, стандартный (u)int64_t. Он описан в стандартном хедере stdint.h. Там же описаны макро-форматы для printf. И, в отличие от ваших костылей, этот тип работает. Причем на всех более-менее современных системах.
P.S. Теоретически, более правильно использовать (u)int_least64_t или (u)int_fast64_t, чтобы компилятор сам подобрал наиболее подходящий тип. Но на практике систему, не поддерживающую строго 64-битные целые представить сложно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
20.07.2021, 19:53
Цитата Сообщение от Rybik001 Посмотреть сообщение
Какой тип данных ты используешь для объявления 64 битной переменной?
Так писали ж уже не раз выше:

Нужна именно знаковая целочисленная 64-битная переменная - используем тип std::int64_t.
Нужна именно переменная для интерфейса с некоей функцией WinAPI, требующей INT64 - используем тип INT64.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2021, 19:53
Помогаю со студенческими работами здесь

Linux Mint 20 x64, Firefox 79 x64. Отключить замыливание текста
Поставил Linux Mint 20, отключил сглаживание шрифтов, поставил шрифты от Windows XP, все хорошо, все нравится. Только в Firefox остался...

Ищу обновления KB938397-x64 и KB968730-x64 для Windows Server 2003x64
Господа плиз ХЕЛП! Ищем обновы KB938397x64 и KB968730x64 для Windows Server 2003x64 RUS, а то сволочной сервер 1С не видит интеренет. ...

HP Pavilion g7 - 2160er переустановил Windows HP x64 на Ultimate x64 - проблема с подсветкой монитора
HP Pavilion g7 - 2160er переустановил windows home premium x64 на Ultimate x64/ Стала выеживаться подсветка монитора - хочет работает,...

Нестандартная ситуация, установка еще одной w7 x64 на уже установленный комп с w7 x64
Всем доброго времени суток ! Не совсем стандартная ситуация, которая посадила меня на гвоздь в позе &quot;шпагат&quot; ))) Есть машинка...

Я переустановил винду и вместо x64 поставил x86! А теперь не могу поставить x64 обратно(((
Я переустановил винду и вместо x64 поставил x86! А теперь не могу поставить x64 обратно((( Пишет что &quot;Версия этого файла несовместима...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru