| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > 4х байтное целое число записать в char[4] |
| Автор: relok 28.11.2010, 17:55 |
| есть большое число (999999999 к примеру) можно ли его двоичное представление красиво записать в char массив? то есть к примеру число 4059099376 (bin=11110001 11110000 11110000 11110000) записать в char msg[4] ? msg[0] будет равно соответственно 11110001 и так далее информатикой не занимался, => на ум приходит только брать первый байт, переводить в десятичное и его кидать в msg[0], и так далее |
| Автор: WhKitten 28.11.2010, 18:11 | ||
Если я правильно понял задачу:
|
| Автор: relok 28.11.2010, 18:14 |
| мне как новичку нифига не понятно) сделал так: tmp[32] - массив из нулей и единиц, который нужно разбить на 4 байта на выходе - ch[4] , 4 числа от 0 до 255 for(i=0;i<4;i++) { ch[i]=0; k=128; for(j=0+i*8;j<8+i*8;j++) { ch[i]+=tmp[j]*k; k=k/2; } } |
| Автор: WhKitten 28.11.2010, 18:24 |
| Мой пример запишет в массив s, числа: 241 240 240 240. Собственно 241 и есть 11110001, а 240 есть 11110000. Функция le, нужна, чтобы убедится, что первыми идут младшие байты числа в памяти. |
| Автор: relok 28.11.2010, 18:35 |
| а что значит unsigned char *p = reinterpret_cast<unsigned char *>(&n);? а именно reinterpret_cast |
| Автор: WhKitten 28.11.2010, 18:40 |
| Преобразует один тип указателя к другому без каких либо проверок. Т.е &n это указатель на unsigned int, берём тот же адрес (тот же указатель), но теперь считаем, что он указывает на unsigned char и присваиваем его p. А далее цикл. Если int 32-х битный, sizeof(n) вернёт 4, и мы запишем 4 байта в массив char'ов. *p++, сначал берёт значение char по указателю, а затем увеличивает его на размер типа, на который указывает указатель, т.е на sizeof(char)==1. |
| Автор: Леопольд 28.11.2010, 19:28 | ||
|
| Автор: WhKitten 28.11.2010, 19:52 |
В Windows для i = 0x1FFFFFFF программа выдаст FFFFFF1F, а на MacOS может выдать 1FFFFFFF |
| Автор: Леопольд 28.11.2010, 22:09 |
| WhKitten, э... и что, сложно сделать std::reverse, или просто пройти в оbратном порядке? Я просто показал что не оbязательно по bайтику каждое число переbирать... А когда у него bудет другой результат на другой платформе, он узнает что есть little endian и big endian. |
| Автор: cardinal 28.11.2010, 22:37 |
| Или вот http://codepad.org/NTiARQaR (раз уж Леопольд такой интересный ресурс показал) |
| Автор: Леопольд 28.11.2010, 22:48 |
| cardinal, это слишком переносимый вариант. Теперь человек не почувствует "на сеbе" разницу в порядке bайт. |
| Автор: sQu1rr 28.11.2010, 23:15 |
Неужели так плохо? |
| Автор: mrbrooks 29.11.2010, 09:48 | ||||
а как же memcpy?
Добавлено через 4 минуты и 27 секунд ха. кстати пришла такая мысля:
Добавлено через 5 минут и 30 секунд хотя Леопольд был раньше. лол. |
| Автор: baldina 29.11.2010, 10:00 | ||
а как же operator=() ?
|
| Автор: mrbrooks 29.11.2010, 10:02 |
о! |
| Автор: cardinal 29.11.2010, 10:26 |
| Вы сделайте .асм листинг для последних трех предложений и посмотрим, что элегантней (мне например очень интересно) |
| Автор: azesmcar 29.11.2010, 10:31 |
а как же alignment? |
| Автор: baldina 29.11.2010, 10:47 | ||
да никак. непричем он |
| Автор: azesmcar 29.11.2010, 10:53 | ||||||
тут должна быть проблема, нет гарантии, что
адрес s сможет разместить int можно так
оператор new должен вернуть указатель, способный разместить любой тип. если я правильно помню такой код вызывал проблемы на SunOS. Кто может проверить? |
| Автор: baldina 29.11.2010, 11:33 | ||
что Вы имеете в виду? Добавлено через 1 минуту и 51 секунду особенно интересно в связи с alignment |
| Автор: baldina 29.11.2010, 11:54 |
| azesmcar, понял. вопрос снят |
| Автор: azesmcar 29.11.2010, 13:04 | ||||
некоторые системы имеют требования к размещению типов. Например так: int должен размещаться по адресу, который делится без остатка на 4. Следовательно грубый cast адреса и размещение в нем типа int может нарушить это требование, отсюда и проблемы переносимости. Стандарт гарантирует, что оператор new вернет адрес, который (не знаю как первести) properly aligned для хранения объекта любого типа (этим занимается сама система).
а для стековых объектов такой гарантии нет. В Loki Александреску использовал трюк с union-ом max_align, но Саттер вроде писал, что это не 100% переносимо, хотя судя по тому, что он не привел примера, эта непереносимость скорее всего проявляется на сферическом компиляторе в вакууме http://www.gotw.ca/gotw/028.htm |