Нужен тип данных который будет: uint64_t для x64 платформ и uint32_t для x32 платформ.
Понятно, что можно самому определить какой-то. Но мне кажется должен стандарт быть на этот случай.
Здравствуйте, maks1180, Вы писали:
M>Нужен тип данных который будет: uint64_t для x64 платформ и uint32_t для x32 платформ.
Непонятно, что такое 64-разрядная и 32-разрядная платформа.
В обычном x86-64 32-разрядный int слегка более эффективен, чем 64-разрядный.
Да даже указатели иногда имеет смысл оставит 32-битными https://en.wikipedia.org/wiki/X32_ABI
Если брать такой int, как указатель, то это intptr_t и unitptr_t.
Если такой, чтобы размер массива поместился — size_t, ssize_t, ptrdiff_t.
Можно упомянуть сюда же atomic_signed_lock_free и atomic_unsigned_lock_free — тип, выгодный для атомарного счётчика.
Да, а если взять просто тип "родной" для целочисленных вычислений, то это, внезапно, просто int.
Ну а то, что он может быть 32 и 64 битным на 64 разрядных платформах, так это потому, что оба примерно одинаково "родные"
AG>Если такой, чтобы размер массива поместился — size_t, ssize_t, ptrdiff_t.
Про size_t я хотел его использовать, у меня он 8 байт на x64 платформе и 4 байт на x32 платформе. Но сбило опредение его как "Alias of one of the fundamental unsigned integer types", так как unsigned int обычно 4 байт и на x64 платформе так же.
Здравствуйте, maks1180, Вы писали:
M> Но сбило опредение его как "Alias of one of the fundamental unsigned integer types", так как unsigned int обычно 4 байт и на x64 платформе так же.
Там же написано "один из". Скорее всего, на х64 будет unsigned long long int
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, maks1180, Вы писали:
AG>>Если такой, чтобы размер массива поместился — size_t, ssize_t, ptrdiff_t.
M>Про size_t я хотел его использовать, у меня он 8 байт на x64 платформе и 4 байт на x32 платформе. Но сбило опредение его как "Alias of one of the fundamental unsigned integer types", так как unsigned int обычно 4 байт и на x64 платформе так же.
Есть ровно 4 "фундаментальных" беззнаковых целочисленных типа: unsigned char, unsigned short, unsigned int и unsigned long (есть еще нестандартный unsigned long long, но про него мы пока промолчим).
Про их размеры гарантируется лишь, что:
1. sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char)
2. sizeof(long) >= 4, sizeof(int) >= 2, sizeof(short) >= 2, sizeof(char) == 1
На самом деле, стандарт дает эти гарантии не в терминах sizeof, а в терминах диапазонов значений, которые вмещают соответствующие типы, но это не очень важно.
И бывают платформы, на которых sizeof(int) == 2. Например, 16-битный MS-DOS. И из современных, думаю 16-битные однокристаллки тоже. Так что не надо думать, что sizeof(int) всегда равен 4, это неверно.
Все остальные типы, всякие там int32_t, size_t и проч являются синонимами (alias'ами) кого-то из них. Причем кого именно, может зависеть от платформы и ключей сборки (через #ifdef).
Здравствуйте, Pzz, Вы писали:
Pzz>На самом деле, стандарт дает эти гарантии не в терминах sizeof, а в терминах диапазонов значений, которые вмещают соответствующие типы, но это не очень важно.
Разница между определениями вылезет на экзотическом CHAR_BIT, что гораздо большая экзотика, чем обычные вариации размеров инта, но всё же существует
Здравствуйте, Alexander G, Вы писали:
Pzz>>На самом деле, стандарт дает эти гарантии не в терминах sizeof, а в терминах диапазонов значений, которые вмещают соответствующие типы, но это не очень важно.
AG>Разница между определениями вылезет на экзотическом CHAR_BIT, что гораздо большая экзотика, чем обычные вариации размеров инта, но всё же существует
Существует, но очень уж редко встречается в реальной жизни. И если встретится, там вылезет много других тонких нюансов. Не думаю, что можно написать сколь-либо сложный платформо-независимый код, который будет из коробки работать на условном юниксе, и совершенно без усилий заработает как есть на платформе, в которой в байте не 8 бит, или количество байт в long/int/short не является степенью двойки.
Здравствуйте, reversecode, Вы писали:
R>вы еще пофантазируйте о каком нибудь инопланетном цпу R>ближе к топику не хотите? R>чувак пишет _декстопный_ софт R>и дальше x32 и x64 не уедет
Сейчас дектопный софт очень легко становится софтом для ARM. А там, глядишь, и MIPS какой-нибудь подтянется. Но вряд ли подтянется какой-нибудь условный DSP с 40-битным размером int, или чем-нибудь в этом роде.
R>поэтому size_t определен во всех стандартных хидерах R>ну или unsigned long
size_t да, его размер совпадает с "интуитивно ясной" "битностью" платформы.
Размер unsigned long на 64-битной венде равен 4-м байтам.
Здравствуйте, maks1180, Вы писали:
M>Нужен тип данных который будет: uint64_t для x64 платформ и uint32_t для x32 платформ. M>Понятно, что можно самому определить какой-то. Но мне кажется должен стандарт быть на этот случай.
Что такое "разрядность платформы"? Если размер указателя, то у вас есть `intptr_t`/`uintptr_t` из <stdint.h>.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Что такое "разрядность платформы"? Если размер указателя, то у вас есть `intptr_t`/`uintptr_t` из <stdint.h>.
А кстати да, хороший вопрос.
Возьмем пример — Аврора ОС, она 32-битная, я на одном из телефонов (AYYA T1 скорее всего) решил узнать архитектуру процессора — arm64.
Для винды тоже что-то подобное провернуть можно было
Здравствуйте, netch80, Вы писали:
M>>>так как unsigned int обычно 4 байт и на x64 платформе так же.
M>>Это не так
N>А где он 8? (Forth не считать, мы про C/C++)
Меня переглючило, я почему-то как unsigned long прочитал, для которого размер разный для Windows x64 и Linux x64
M>Нужен тип данных который будет: uint64_t для x64 платформ и uint32_t для x32 платформ. M>Понятно, что можно самому определить какой-то. Но мне кажется должен стандарт быть на этот случай.
Зачем?
Скорость обращения к 64 и к 32 на 64-бит платформе одинаковая
Однако зная точно размер перепоонения, вы не наделаете ошибок
Здравствуйте, maks1180, Вы писали:
M>Нужен тип данных который будет: uint64_t для x64 платформ и uint32_t для x32 платформ. M>Понятно, что можно самому определить какой-то. Но мне кажется должен стандарт быть на этот случай.
дефайны же встроенные:
x86-64
#define __INT16_MAX__ 0x7fff
#define __INT16_TYPE__ short int
#define __INT32_MAX__ 0x7fffffff
#define __INT32_TYPE__ int
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int
#define __INT8_MAX__ 0x7f
#define __INT8_TYPE__ signed char
ARM 32 бита, x86 нету под рукой
#define __INT16_MAX__ 0x7fff
#define __INT16_TYPE__ short int
#define __INT32_MAX__ 0x7fffffff
#define __INT32_TYPE__ int
#define __INT64_MAX__ 0x7fffffffffffffffLL
#define __INT64_TYPE__ long long int
#define __INT8_MAX__ 0x7f
#define __INT8_TYPE__ signed char
для unsigned аналогично но с буквой U, и только в относительно новых версиях компиляторов.
Здравствуйте, maks1180, Вы писали:
M>Нужен тип данных который будет: uint64_t для x64 платформ и uint32_t для x32 платформ. M>Понятно, что можно самому определить какой-то. Но мне кажется должен стандарт быть на этот случай.