Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

Усечение разрядности

19.12.2014, 10:05. Показов 1390. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть есть переменная большой разрядности. Например,
C++
1
uint64_t x;
. Зависит ли результат
C++
1
y=(uint32_t)x;
от порядка байт? То есть гарантированно ли в y окажется младшее двойное слово x, или же двойное слово, занимающее младшие адреса в x? А
C++
1
z=(uint32_t)(x>>32);
гарантированно ли поместит в z старшее двойное слово x, или же двойное слово, занимающее старшие адреса в x? А при смешанном порядке байт в четверном слове не окажутся ли y и z в перемешку байты из старшего и младшего двойных слов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2014, 10:05
Ответы с готовыми решениями:

Усечение числа с плавающей точкой
Доброго времени суток! Собсно сабж. floor(v*1000)/1000 не помогает, обнуляется только несколько знаков после запятой, а остальные...

warning C4309: =: усечение константного значения
Добрый вечер. Почему-то С++ отказывается выводить на экран русские буквы: вместо них бессмысленный набор символов. Я решил написать...

Усечение константного значения при присвоении значений объектам структуры
Здравствуйте! Есть вот такой код: #include <iostream> using namespace std; struct date { int day; char month; int...

14
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
19.12.2014, 10:26
Если static_cast<uint32_t>(x), то думаю гарантировано. А си касты... Тут без понятия.
Самой интересно.

Добавлено через 10 минут
Нашла статейку. Может пригодится по теме.
http://en.cppreference.com/w/c... licit_cast
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
19.12.2014, 10:31
Зависит
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
19.12.2014, 10:43
В данном случае Вы работаете со значениями, а говорите о адресах.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2014, 10:44  [ТС]
А результат сдвигов тоже зависит?
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
19.12.2014, 10:56
taras atavin, нет, битовые операции работают как им и положено.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2014, 11:02  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
В данном случае Вы работаете со значениями, а говорите о адресах.
Есть некий x, занимающий 8 байт. Значение этого икса имеет младшее и старшее двойное слово. Но данный икс находится где то в памяти и состоит из байтов по адресам: (uint8_t*)(&x), ((uint8_t*)(&x))+1, ((uint8_t*)(&x))+2, ((uint8_t*)(&x))+3, ((uint8_t*)(&x))+4, ((uint8_t*)(&x))+5, ((uint8_t*)(&x))+6 и ((uint8_t*)(&x))+7 и каждое из двойных слов значения тоже хранится где то в памяти на половине этих адерсов, например, при litle-endian младшее занимает адреса (uint8_t*)(&x), ((uint8_t*)(&x))+1, ((uint8_t*)(&x))+2 и ((uint8_t*)(&x))+3, а старшее ((uint8_t*)(&x))+4, ((uint8_t*)(&x))+5, ((uint8_t*)(&x))+6 и ((uint8_t*)(&x))+7, при big-endian наоборот, а смешанный порядок байт может быть таким, что каждое из двойных слов значения будет занимать байты и до ((uint8_t*)(&x))+3 включительно, и начиная с ((uint8_t*)(&x))+4. Вопрос: после
C++
1
y=(uint32_t)x;
в игрек окажется младшее двойное слово значения, или всегда двойное слово, расположенное по адресам (uint8_t*)(&x), ((uint8_t*)(&x))+1, ((uint8_t*)(&x))+2 и ((uint8_t*)(&x))+3? А после
C++
1
z=(uint32_t)(x>>32);
в z будет старшее двойное слово значения, или всегда двойное слово на адресах ((uint8_t*)(&x))+4, ((uint8_t*)(&x))+5, ((uint8_t*)(&x))+6 и ((uint8_t*)(&x))+7?

Добавлено через 4 минуты
Цитата Сообщение от Тамика Посмотреть сообщение
Нашла статейку. Может пригодится по теме. http://en.cppreference.com/w/c... licit_cast
1. Вообще то у меня приведение явное.
2. По каким правилам выполняется само преобразование, не сказано.

Добавлено через 1 минуту
arrjj, мне надо разделить значение на старшую и младшую часть. Как это сделать переносимо? В другом случае надо разобрать значение на байты и снова собрать из байтов, при этом важно, какой по старшинству байт попадёт в каждое место.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
19.12.2014, 11:08
мб так нагляднее будет
uint a = 0xA1B2C3D4
представление в памяти
little-endian
(uint) D4C3B2A1
(ushort) D4C3B2A1
a>>8
(uint) C3B2A100
(ushort) C3B2A100

big-endian
(uint) A1B2C3D4
(ushort) A1B2C3D4
a >> 8
(uint) 00A1B2C3
(ushort) 00A1B2C3

PDP-endian
(uint)B2A1D4C3
(ushort)B2A1D4C3
a>>8
(uint) A100C3B2
(ushort)A100C3B2
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
19.12.2014, 11:14
arrjj, помоему фигня какая-то, есть правило при приведении типов, именно приведении типов(а не указателей на типы), если uint привести к ushort всегда отрежутся старшие байты, независимо от того акой порядок байт в системе

Добавлено через 2 минуты
то что Вы написали скорее всего будет справедливо при преобразовании указателей, т.е
C++
1
2
3
uint x = 0xCAFCABD3;
uint * p = &x;
unsigned short * ps = p;
тут еще будет походить на Ваш вариант
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
19.12.2014, 11:14
Цитата Сообщение от taras atavin Посмотреть сообщение
Как это сделать переносимо?
обычно компиляторы или фреймворки представляют макросы свои
в Qt это QtGlobal Q_BYTE_ORDER
в boost есть BOOST_LITTLE_ENDIAN и BOOST_LITTLE_ENDIAN
в GNU libc тоже есть __BYTE_ORDER макросы
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2014, 11:23  [ТС]
Цитата Сообщение от arrjj Посмотреть сообщение
обычно компиляторы или фреймворки представляют макросы свои
в Qt это QtGlobal Q_BYTE_ORDER
в boost есть BOOST_LITTLE_ENDIAN и BOOST_LITTLE_ENDIAN
в GNU libc тоже есть __BYTE_ORDER макросы
Ну узнал я порядок байт. И что мне с ним дальше делать? Узнать, кстати, не проблема:
C++
1
2
3
4
5
6
7
uint64_t s;
char *p=(char*)(&s);
uint8_t i;
for (i=0; i<8; ++i, ++p)
{
 *p=i; 
}
. Всё, значение s однозначно идентифицирует порядок байт.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
19.12.2014, 11:24
Цитата Сообщение от taras atavin Посмотреть сообщение
C++
1
uint64_t s;
хотя бы проинициализируйте
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2014, 11:28  [ТС]
Цитата Сообщение от aLarman Посмотреть сообщение
хотя бы проинициализируйте
Ты бы хоть исходник прочитал.
0
19.12.2014, 11:31

Не по теме:

ну да мой косяк, вот только не помню что бы мы на "ты" перешли

0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
19.12.2014, 11:31
ой сори.

каст всегда даёт одинаковый результат. разница только при касте указателей
т.е. y=(uint32_t)x; будет всегда одинаковый, но y=*(uint32_t*)&x; будет разный

дико извиняюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2014, 11:31
Помогаю со студенческими работами здесь

Увеличение разрядности
Проблема следующая: в процессе вычисления 32битных чисел возникает переполнение. Причём значительное. Хотелось бы получить результат 512...

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

Число заданной разрядности
Нет ли какого-то шаблона, позволяющего получить число заданной аргументом этого шаблона разрядности? Что-то вроде...

Перевод чисел любой разрядности
День добрый. Прошу помочь алгоритмом перевода чисел из одной системы счисления в другую - в данном случае из 8 в 10 и обратно - чисел...

Влияние разрядности процессора на количество операций
Здравствуйте. Объясните по подробней ответ на вопрос: сколько операций совершает процессор при сложении двух чисел, возведении их в степень...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru