Определение int64_t
Я новичок в C/С++, поэтому у меня есть пара вопросов по базовому типу:
a) Можете ли вы объяснить мне разницу между int64_t
и long
(long int
)?
По моему мнению, оба являются 64-битными целыми числами. Есть ли какая-то причина выбора одного над другим?
b) Я попытался найти определение int64_t
в Интернете без особого успеха. Есть ли авторитетный источник, с которым мне нужно проконсультироваться по таким вопросам?
c) Для кода, использующего int64_t
для компиляции, я в настоящее время включаю <iostream>
, что для меня не имеет большого смысла. Существуют ли другие, которые предоставляют объявление int64_t
?
Ответы
Ответ 1
a) Можете ли вы объяснить мне разницу между int64_t
и long
(long int
)? По моему мнению, оба являются 64-битными целыми числами. Есть ли какая-то причина выбора одного над другим?
Первый - это целочисленный тип со знаком ровно с 64 битами. Последний представляет собой целочисленный тип со знаком с не менее чем 32 битами.
b) Я попытался найти определение int64_t
в Интернете без особого успеха. Есть ли авторитетный источник, с которым мне нужно проконсультироваться по таким вопросам?
http://cppreference.com описывает это здесь: http://en.cppreference.com/w/cpp/types/integer. Однако авторитетным источником является стандарт С++ (этот конкретный бит можно найти в §18.4. Целочисленные типы [cstdint]).
c) Для кода, использующего int64_t
для компиляции, я включаю <iostream>
, что для меня не имеет большого значения. Существуют ли другие, которые предоставляют объявление int64_t
?
Он объявлен в <cstdint>
или <cinttypes>
(в пространстве имен std
) или в <stdint.h>
или <inttypes.h>
(в глобальном пространстве имен).
Ответ 2
int64_t
гарантируется стандартом C99 на ширину 64 бита на платформах, которые его реализуют, нет такой гарантии для long
, которая составляет не менее 32 бит, поэтому она может быть больше.
§7.18.1.3 Точные целые типы 1 имя typedef intN_t обозначает знаковый целочисленный тип с шириной N, без битов дополнения и представление двойного дополнения. Таким образом, int8_t обозначает подписанный целочисленный тип с шириной ровно 8 бит.
Ответ 3
int64_t
typedef
вы можете найти, что в <stdint.h>
в C
Ответ 4
int64_t должен иметь ширину 64 бит на любой платформе (отсюда и название), тогда как длина может иметь разную длину на разных платформах. В частности, sizeof (long) часто 4, т.е. 32 бит.