почему на 64ех битной платформе std::is_same<long, long long>::value возвращает false, в то время как sizeof(long) == sizeof(long long) возвращает true ?
в чем разница?
почему оно так?
и для чего?
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>привет!
X>почему на 64ех битной платформе std::is_same<long, long long>::value возвращает false, в то время как sizeof(long) == sizeof(long long) возвращает true ? X>в чем разница? X>почему оно так? X>и для чего?
X>спасибо.
потому что разные интегральные типы, и требования от стандарта только, что
sizeof(long long) >= sizeof(long)
X>почему оно так? X>и для чего?
это не правильные вопросы, и не нужные, это данность и всё.
нужна фиксировання размерность-
используйте int32_t, int64_t и т.д.
Здравствуйте, niXman, Вы писали:
X>привет!
X>почему на 64ех битной платформе std::is_same<long, long long>::value возвращает false, в то время как sizeof(long) == sizeof(long long) возвращает true ? X>в чем разница? X>почему оно так? X>и для чего?
X>спасибо.
Я вас наверное удивлю, но std::is_same<long, int>::value и std::is_same<double, long double>::value произведут тот же эффект
Здравствуйте, niXman, Вы писали:
X>привет!
X>почему на 64ех битной платформе std::is_same<long, long long>::value возвращает false, в то время как sizeof(long) == sizeof(long long) возвращает true ? X>в чем разница? X>почему оно так? X>и для чего?
Для избавления от ложного доверия на случай переноса?
Надо ещё сравнить их же с int64_t, если различаются — значит, та же проблема.
Так же gcc реагирует на подстановку int64_t к %lld, хотя они на конкретной платформе совпадают.
Здравствуйте, saf_e, Вы писали:
_>Я вас наверное удивлю, но std::is_same<long, int>::value и std::is_same<double, long double>::value произведут тот же эффект
та это я знаю =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>почему на 64ех битной платформе std::is_same<long, long long>::value возвращает false, в то время как sizeof(long) == sizeof(long long) возвращает true ? X>в чем разница?
разные типы
X>почему оно так?
Если бы они были опционально одним и тем же типом в зависимости от платформы, то на этих платформах ломалась бы перегрузка (по неоднозначности) и пришлось бы заниматься специальными приседаниями, чтоб перегрузка для long long не попадала в компилятор на тех платформах, где они одинаковы (т.е. #ifdef и прочие радости).
Здравствуйте, jazzer, Вы писали:
J>Если бы они были опционально одним и тем же типом в зависимости от платформы, то на этих платформах ломалась бы перегрузка (по неоднозначности) и пришлось бы заниматься специальными приседаниями, чтоб перегрузка для long long не попадала в компилятор на тех платформах, где они одинаковы (т.е. #ifdef и прочие радости).
да, уже понял.
спасибо Klikujiskaaan.
вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>привет!
X>почему на 64ех битной платформе std::is_same<long, long long>::value возвращает false, в то время как sizeof(long) == sizeof(long long) возвращает true ? X>в чем разница? X>почему оно так? X>и для чего?
Потому что std::is_same проверяет на одинаковость типов, а не на одинаковость представлений этих типов. Например, std::is_same<char, signed char>::value будет false на любой платформе, потому что это разные типы, а std::is_same<int, signed int>::vlue будет равно true, так как это один и тот же тип. А использоваться это должно в шаблонном коде, где типы неизвестны.
X>спасибо.
Здравствуйте, _DAle_, Вы писали:
_DA>Потому что std::is_same проверяет на одинаковость типов, а не на одинаковость представлений этих типов. Например, std::is_same<char, signed char>::value будет false на любой платформе, потому что это разные типы, а std::is_same<int, signed int>::vlue будет равно true, так как это один и тот же тип. А использоваться это должно в шаблонном коде, где типы неизвестны.
да, я уже понял что вопрос некорректен.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, uzhas, Вы писали:
X>>>почему оно так?
U>аналогичный гемор с size_t, который иногда совпадает с unsigned, а иногда не совпадает
Вы меня так не пугайте! size_t всегда unsigned integer type.
18.2/6
The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size
in bytes of any object.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, uzhas, Вы писали:
U>>Здравствуйте, uzhas, Вы писали:
X>>>>почему оно так?
U>>аналогичный гемор с size_t, который иногда совпадает с unsigned, а иногда не совпадает
BFE>size_t всегда unsigned integer type.
И что? unsigned integer type — это не всегда unsigned. Верно лишь обратное, что unsigned является unsigned integer type.
Соответственно ничто не мешает size_t иногда не совпадать с unsigned.
Здравствуйте, B0FEE664, Вы писали:
BFE>Вы меня так не пугайте! size_t всегда unsigned integer type.
ЕМНИП, size_t должен быть определен в <cstddef>, через typedef, т.е. формально может совпасть с любым "настоящим" встроенным типом. Что в корне отличается от ситуации с long и long long
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Здравствуйте, watchmaker, Вы писали:
U>>>аналогичный гемор с size_t, который иногда совпадает с unsigned, а иногда не совпадает BFE>>size_t всегда unsigned integer type. W>И что? unsigned integer type — это не всегда unsigned. Верно лишь обратное, что unsigned является unsigned integer type. W>Соответственно ничто не мешает size_t иногда не совпадать с unsigned.
Если вы под unsigned подразумеваете unsigned int (а не unsigned type), то, разумеется, size_t может с ним не совпадать. Ну и что тут такого "геморройного"?
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, uzhas, Вы писали:
X>>>почему оно так?
U>аналогичный гемор с size_t, который иногда совпадает с unsigned, а иногда не совпадает
Если под unsigned ты понимаешь unsigned int, то да, может не совпадать. Но size_t — всегда беззнаковый, обычно unsigned long. Есть ещё знаковый тип ssize_t.