2017-01-04 6 views
2

Я попробовал это на моем компьютерепочему долго не int64_t, но у них одинаковый размер?

std::cout << std::is_same<int64_t, long long>::value; 
std::cout << std::is_same<int64_t, long>::value; 
std::cout << sizeof(long); 
std::cout << sizeof(long long); 
std::cout << sizeof(int64_t); 

и результат false, true, 8, 8, 8

Я знаю int64_t точно 64 бит, и это показывает long такое же, как int64_t, но long long отличается от int64_t и это также 64bit. Почему это могло произойти?

EDIT

Могу ли я использовать long long и int64_t взаимозаменяемые на моей машине, при условии, что они оба типа целое и имеют одинаковый размер?

+1

«длинный» и «длинный длинный» - разные типы, несмотря на одинаковый размер –

+0

double также имеет размер 8, но .. –

+0

@MM я знаю 'long' может быть 32bit на некоторой машине s ... но каковы различия, когда «длинные» и «длинные» 64 бит? – bbvan

ответ

7

long и long long - это встроенные типы, определенные основным языком.

int64_t определяется заголовком <cstdint> (на практике включают <stdint.h>). Он определен как псевдоним для некоторого встроенного типа. В вашем случае он определяется как псевдоним для long.


Встроенный типов, которые могут быть таким же размером, на какую платформе еще нужно рассматривать как отдельные виды, чтобы не создавать неоднозначные вызовы перегруженных функций.

Есть даже встроенные цифровые типы, которые гарантируют одинаковый размер и подпись, но все же отличаются друг от друга. А именно, все три из unsigned char, char и signed char отличаются друг от друга и имеют размер 1, но char должен быть такой же, как и у других. Хотя я не рекомендую это делать, технически вы можете свободно перегружать функции, основываясь только на этой разнице.


Re

Могу ли я использовать long long и int64_t взаимозаменяемые на моей машине, при условии, что они оба типа целое и имеют одинаковый размер?

Это зависит от того, что вы подразумеваете под “ взаимозаменяемо ”.

Поскольку int64_t с компилятором является псевдонимом для long, вы не можете вызвать функцию с ожидаемым int64_t* с long long* указателем.

Но long long гарантированно будет по крайней мере, 64 бита, и в этом смысле только по отношению к читаемости, что это особенно важно, какие из long long и int64_t вы выбираете.

0

3.9.1

Есть пять стандартных Подписанные целочисленных типов: «подписан символ», «короткие ИНТ», «Int», «длинный ИНТ» и «долго долго Int»

[18.4.1] того же говорит, что

использованием int64_t = знаковый целочисленный тип; // опционально

Итак, вы смотрите на два разных основных типа и сравниваете их с псевдонимом типа. В вашем случае его int64_t является совмещенным с long однако может быть реализация, когда его совмещенным с long long int


Что касается вас дополнительного вопроса, это зависит от того, что вы имеете в виду взаимозаменяемости, long long, по крайней мере до тех пор, a long, но теоретически или в будущем может быть «длиннее», используя эти типы взаимозаменяемо, по-прежнему требуется литье типов

+0

Здесь вам нужно подробнее обратиться к этому вопросу –