Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/76: Рейтинг темы: голосов - 76, средняя оценка - 4.86
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

uint32, size_t и подобные им

01.09.2013, 10:53. Показов 15512. Ответов 41
Метки нет (Все метки)

Собственно, в чем смысл данных типов, в отличие от обычных unsigned int, int и подобных им?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2013, 10:53
Ответы с готовыми решениями:

Беззнаковый тип size_t: чем различие между size_t, uintptr_t, ptrdiff_t и intptr_t?
В чем вообще его смысл? Разве запись double a = {1,2,3}; int i = 1; *(a+i)+=1; значит,...

uint32 и UINT64
Господа, не подскажете ли, какие магические слова надо написать, чтобы начать использовать тип...

Преобразование массива к uint32
Есть задание: создать массив случайных чисел (от -100 до 100) A, сделать массив B1 из A такой,...

Отличие Uint32 от Int32
Господа, понимающие. Объясните, пожалуйста в чём отличие? Рихтер говорит int32 это числовой тип...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
41
941 / 685 / 229
Регистрация: 28.04.2013
Сообщений: 1,923
01.09.2013, 10:59 2
Использование memsize типов (таких как size_t, ptrdiff_t, INT_PTR) в 64-битных программах, вместо 32-битных типов (int, unsigned) позволяет:
  1. Построить компилятору более простой и, следовательно, более быстрый код, в котором будут отсутствовать лишние преобразования 32-битных и 64-битных данных. Особенно это полезно при работе с адресной арифметикой и индексации массивов.
  2. Избежать ряда ошибок при обработке большого объема входных данных, когда количество обрабатываемых элементов превышает количество UINT_MAX.
  3. Избежать ряда других, более специфичных ошибок.
  4. Сделать код более переносимым между 64-битными Windows и Linux системами, в которых используются различные модели данных. Так, например, в Linux системах для индексации больших массивов можно использовать тип unsigned long, а в Windows нет.
как то так )

Добавлено через 3 минуты
http://www.viva64.com/ru/a/0050/
1
3327 / 2701 / 732
Регистрация: 25.03.2012
Сообщений: 9,770
Записей в блоге: 1
01.09.2013, 12:50 3
Например, переносимость. Если использовать, например, unsigned int вместо size_t, программа будет работать только на 32разрядных системах! Например, придётся писать отдельную программу для 64х разрядных, например.
...например.
1
Ушел с форума
Эксперт С++
16420 / 7395 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
01.09.2013, 12:57 4
uint32 - это тип фиксированного размера (32-бита). Иметь такие типы иногда очень желательно.
Например, вы передаете данные по сети и хотите быть уверенными, что на другой стороне
их тоже прочитают правильно. Независимо от версии компилятора и разрядности ОС.

А размер size_t (также, как и ptrdiff_t) варьируется, в зависимости от архитектуры.
На x86 size_t равен 4 байтам, а на x64 - уже восьми. Это помогает поддерживать
работу с объемами памяти соответствующего размера. Кроме того, название size_t
более описательно, чем int: видя функцию, которая возвращает size_t, сразу
становится понятно, что возвращается какой-то размер, а не просто число.
1
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
01.09.2013, 13:11 5
Цитата Сообщение от nexen Посмотреть сообщение
Собственно, в чем смысл данных типов, в отличие от обычных unsigned int, int и подобных им?
Не читая предыдущих сообщений скажу:
size_t - беззнаковый целый тип, гарантирующий правильную ( [0,размер массива] ) индексацию массива не зависимо от платформы. Грубо говоря - максимальный беззнаковый целый тип платформы.
uint32 - видимо имелось в виду uint32_t. Это беззнаковый целый тип, гарантирующий размерность ("ширину") переменной 32 бита.
unsigned int - так сказать, language-specific, просто беззнаковый целый тип, "ширина" которого может отличаться от платформы и ОС, т.е. например, компилируя 32-битное приложение "ширина" типа unsigned int будет равна 32-м битам, в 64-битном приложении "ширина" будет равна 64-м битам.
Остальное по-аналогии.
2
OhMyGodSoLong
01.09.2013, 13:17
  #6

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
Например, вы передаете данные по сети и хотите быть уверенными, что на другой стороне их тоже прочитают правильно. Независимо от версии компилятора и разрядности ОС.
Для этого надо передавать байты. Endianness же.

2
castaway
01.09.2013, 13:20
  #7

Не по теме:

Тут я не могу не согласится с OhMyGodSoLong. Пример не очень удачный..

1
fasked
01.09.2013, 13:20
  #8

Не по теме:

OhMyGodSoLong, для этого есть htonl/ntohl

1
Ушел с форума
Эксперт С++
16420 / 7395 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
01.09.2013, 13:20 9
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Для этого надо передавать байты. Endianness же.
Согласен. Просто как пример.
А для реальной платформо-независимости лучше вообще XML/JSON...
1
castaway
01.09.2013, 13:23
  #10

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
OhMyGodSoLong, для этого есть htonl/ntohl
Не думаю что кто-то применяет её для "преобразования" данных для последующей передачи.

1
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.09.2013, 13:26 11
Цитата Сообщение от castaway Посмотреть сообщение
Не думаю что кто-то применяет её для "преобразования" данных для последующей передачи.
Я просто не могу представить для чего еще их можно применять, потому что именно для этого они и сделаны:
htonl, htons, ntohl, ntohs - convert values between host and network byte order
0
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2013, 13:28 12
Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:

OhMyGodSoLong, для этого есть htonl/ntohl

Не по теме:

У которых нет стандартных вариантов для восьмибайтных величин. И которых нет на POSIX-несовместимых системах.

1
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
01.09.2013, 13:30 13
Цитата Сообщение от fasked Посмотреть сообщение
Я просто не могу представить для чего еще их можно применять, потому что именно для этого они и сделаны
Ты не совсем правильно понял то что я хотел донести.. Если есть функция для преобразования порядка байтов в "правильный" порядок, то это не значит что ей обязаны пользоваться все поголовно. Я к тому, что "матерые" программисты ей не пользуются передавая данные.
1
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.09.2013, 13:45 14
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
У которых нет стандартных вариантов для восьмибайтных величин. И которых нет на POSIX-несовместимых системах.
В стандарте много чего нет, и всегда можно быстро набросать что-то подобное:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define TYP_INIT 0 
#define TYP_SMLE 1 
#define TYP_BIGE 2 
 
unsigned long long htonll(unsigned long long src) { 
  static int typ = TYP_INIT; 
  unsigned char c; 
  union { 
    unsigned long long ull; 
    unsigned char c[8]; 
  } x; 
  if (typ == TYP_INIT) { 
    x.ull = 0x01; 
    typ = (x.c[7] == 0x01ULL) ? TYP_BIGE : TYP_SMLE; 
  } 
  if (typ == TYP_BIGE) 
    return src; 
  x.ull = src; 
  c = x.c[0]; x.c[0] = x.c[7]; x.c[7] = c; 
  c = x.c[1]; x.c[1] = x.c[6]; x.c[6] = c; 
  c = x.c[2]; x.c[2] = x.c[5]; x.c[5] = c; 
  c = x.c[3]; x.c[3] = x.c[4]; x.c[4] = c; 
  return x.ull; 
}
Передавать байтами, а потом склеивать это, как говорится, "те же яйца, только в профиль".
Цитата Сообщение от castaway Посмотреть сообщение
"матерые" программисты ей не пользуются передавая данные
Ну-ну
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2013, 13:46  [ТС] 15
Убежденный, int на x86 = 4, а на x64 = 8?
0
castaway
01.09.2013, 13:49
  #16

Не по теме:

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

0
Ушел с форума
Эксперт С++
16420 / 7395 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
01.09.2013, 13:50 17
Цитата Сообщение от nexen Посмотреть сообщение
Убежденный, int на x86 = 4, а на x64 = 8?
На Windows они равны. LLP64.
На счет других ОС - не поручусь.
1
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
01.09.2013, 13:51 18
Цитата Сообщение от nexen Посмотреть сообщение
Убежденный, int на x86 = 4, а на x64 = 8?
x86 - это 386, 486, 586, 686 и т.п.
А что такое x64 ?
1
fasked
01.09.2013, 14:05
  #19

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Вы изменитесь в моих глазах, если скажете что используете данную функцию при каждой передаче данных в сеть.
Теперь уже не использую, потому что в связи со сменой проекта работаю на гораздо более высоком уровне. Ну и к слову, "grep -R htonl ." по исходникам прошивки DDWRT для роутеров выдает достаточное количество совпадений, чтобы опровергнуть слова о "матерых" программистах. Относительно стандартное применение htonl-like функции выглядит так:
Код
./btstream.cpp:  *p = htonl(idx); p++;
./btstream.cpp:  *p = htonl(off); p++;
./btstream.cpp:  *p = htonl(len);

1
Модератор
Эксперт по электронике
8380 / 6225 / 836
Регистрация: 14.02.2011
Сообщений: 21,605
01.09.2013, 14:11 20
Цитата Сообщение от castaway Посмотреть сообщение
x86 - это 386, 486, 586, 686 и т.п.
А что такое x64 ?
x86 принято так называть 32 битные процессоры
в них не входит 8086, 8088, 80186, 80286 они не 32 битные
x64 соответственно 64битные
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2013, 14:11

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Преобразование шестнадцатиричной последовательности в UInt32
Здравствуйте, не работает библиотека Globalization для преобразования hex в UInt32 using...

Преобразование UInt32 в UInt64. Ошибка MSDN?
Почему в справке msdn в таблице преобразования типов, НЕ написано что тип UInt32 можно без потерь...

Преобразовать массив байтов (Byte[]) в целое без знака (UInt32)
Всем привет. У меня простой вопрос. Мне нужно преобразовать массив байтов (Byte) в целое без знака...

Как из Uint64 переписать правые 32 раряда в число формата Uint32
Подскажите, как из Uint64 переписать правые 32 раряда в число формата Uint32, или левые 32, не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.