В какой библиотеке содержится uint32 t
Перейти к содержимому

В какой библиотеке содержится uint32 t

  • автор:

Зачем использовать uint32_t?

Гарантируется ли, что типы с явным указанием размера (такие, как uint32_t , uint64_t , uint16_t ) занимают одинаковое количество памяти на всех платформах (на десктопах, на мобилах, на микроконтроллерах)? Собственно, независимо от ответа, как эти типы можно использовать, есть ли какие-нибудь особенные задачи, где очень нужно знать размер в битах? Маски, флаги? Верно ли то, что в современном C обычный деревянный int под неким табу и не стоит использовать типы, размер которых меняется от платформы к платформе (здесь важны ссылки на стандарт, если он каким-то образом это регулирует или на мануалы к компилятору)?

Отслеживать
задан 14 фев 2017 в 11:51
6,459 4 4 золотых знака 35 35 серебряных знаков 57 57 бронзовых знаков
14 фев 2017 в 12:00
Возможный дубликат вопроса: cstdint правильное использование
14 фев 2017 в 12:07

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

типы с явным указанием размера

Стандарт гарантирует их размеры, но не их существование. Т. е. теоретически можно встретить платформу, на которой нет нужного типа. Зато если уж программа скомпилировалась, то размер типа ты точно знаешь.

Там ещё есть типы со словом least , например, uint_least32_t , если тебе надо хотя бы 32 бита.

Стандарт не гарантирует его размер.

не стоит использовать типы, размер которых меняется от платформы к платформе

Всё зависит от задач. Если мне нужна 32-битная маска для перебора, то логично не полагаться на int. Если какой-то размер, то есть size_t , зависящий от битности программы. А если мне нужно вывести число процентов, то можно и обычный int взять.

Отслеживать
ответ дан 14 фев 2017 в 12:11
124k 24 24 золотых знака 131 131 серебряный знак 312 312 бронзовых знаков
Меньше крестов, но ответы от тех же людей 🙂 P.S. уже нет.
14 фев 2017 в 12:13

Типы вида intN_t или uintN_t обязаны иметь размер в битах, в точности совпадающий с N . Об этом написано в Стандарте языка (пример для intN_t ):

7.20.1.1 Exact-width integer types
1 The typedef name intN_t designates a signed integer type with width N , no padding bits, and a two’s complement representation. Thus, int8_t denotes such a signed integer type with a width of exactly 8 bits.

Точный размер типов нужен при взаимодействии разных компонентов системы, которые могут работать на различных платформах. Т.к. sizeof(int) не регламентирован стандартом, его нельзя безопасно использовать в таких случаях. Но если переменная этого типа не выходит за границы одной системы, то разумнее опираться именно на базовые типы, вроде int .

Дополнительную информацию можно почерпнуть в похожем вопросе по c++.

What is u_int32_t? [duplicate]

Hi I’m doing porting from Linux to Visual C ++. And I found quite a few errors. What is u_int32_t ? I can’t find it in Visual C ++? Is it only available in Linux? Which type should I use in Visual C++? Thanks in advance . Kevin

1 1 1 silver badge
asked Mar 2, 2011 at 5:42
13.8k 31 31 gold badges 81 81 silver badges 107 107 bronze badges

5 Answers 5

The C99 header stdint.h defines types that do not depend on architecture or compiler. The meaning of unsigned int can differ (e.g. 16bit wide on a 16bit system), but those types from stdint.h have a specific size.

Either the additional underscore accidentally slipped in there, or someone re-typed them for some library or whatever. If the latter one is the case, include some header of your own, in that header include stdint.h and make sure to typedef uint32_t u_int32_t after the include.

Для чего нужны данные типы?

int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t Я понимаю что они определяют статический размер переменных на всех устройствах но для чего это нужно. + почему нет аналогий для других типов?

Отслеживать
задан 3 дек 2018 в 17:08
1,129 9 9 серебряных знаков 21 21 бронзовый знак
Для каких «других типов»?
3 дек 2018 в 17:55

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Эти типы нужны тогда, когда переменная должна иметь точный размер при портировании программы на другую систему или компилятор. Например, если нам нужно работать с большим файлом, его размер можно представить как size_t . Но при компиляции под 32 бита такая переменная имеет размер 32 бита и программа будет работать неправильно с большими файлами. uint64_t гарантирует правильную работу в любой системе.

Другой пример: поле в двоичном файле занимает 4 байта и нам нужно его считать в переменную. Тип int может быть 2-х, 4-х, и 8-и байтовым, поэтому при чтении в переменную int в первом случае испортится память, а в последнем — старшие 4 байта переменной будут содержать мусор. Решение — использовать int32_t .

почему нет аналогий для других типов?

Есть. Для символов есть char8_t , char16_t , и char32_t . Для вещественных — float и double . Остается только bool , но для него особой проблемы нет.

Difference between uint32 and uint32_t [duplicate]

What is the difference between uint32 and uint32_t in C/C++? Are they OS-dependent? In which case should I use one or another?

31.2k 22 22 gold badges 109 109 silver badges 132 132 bronze badges
asked Nov 13, 2012 at 14:01
2,485 7 7 gold badges 42 42 silver badges 72 72 bronze badges
You should prefer Standard types wherever possible. In this case, uint32_t .
Nov 13, 2012 at 14:04
guys. You can find answer here: stackoverflow.com/questions/11786113/…
Nov 13, 2012 at 14:04
Out of curiosity — what is the «_t» meant to indicate?
Apr 22, 2017 at 21:28
Shorthand for «type».
May 29, 2017 at 16:18

2 Answers 2

uint32_t is standard, uint32 is not. That is, if you include or , you will get a definition of uint32_t . uint32 is a typedef in some local code base, but you should not expect it to exist unless you define it yourself. And defining it yourself is a bad idea.

answered Nov 13, 2012 at 14:02
William Pursell William Pursell
208k 48 48 gold badges 270 270 silver badges 305 305 bronze badges
typedef uint32_t uint32?
Jun 22, 2014 at 20:23

If it doesn’t exist, you won’t be able to compile your program, right? Then you could do like Max suggested above. What’s the big deal about it?

May 14, 2020 at 4:26

@Rodrigo The «big deal» is the same as doing #define writef printf . Technically, things will work just fine. But it introduces unnecessary confusion. And you’d be surprised how frequently you’ll see simple typedefs like this morph over time until a code base has things like typedef uint16_t uint32 , at which point the universe explodes.

May 14, 2020 at 16:23
Yes, I’ve dreamed of that already 🙂
May 14, 2020 at 16:49

Why is typedef uint32_t uint32 bad? Surely the argument that someone shouldn’t use a sensible typedef because someone could create an insane typedef is wrong. Eg we don’t say pencils are evil since a crazy coworker could take a pencil and stab someone with it.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *