|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Добрый вечер. А может кто-нибудь пояснить , что физически представляет собой преобразование массива из байтов в unsigned long ? Код: plaintext 1. 2. 3. 4.
в результате X = 2030976 почему получается это число ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 23:01 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
andron81, Это не преобразование массива. Это преобразование адреса массива к unsigned long. Т.е. в unsigned long сохранился адрес массива в оперативной памяти. В данном случае адрес массива равен адресу нулевого элемента этого массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 23:06 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
petrav andron81, Это не преобразование массива. Это преобразование адреса массива к unsigned long. Т.е. в unsigned long сохранился адрес массива в оперативной памяти. В данном случае адрес массива равен адресу нулевого элемента этого массива. спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 23:12 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
petrav andron81, Это не преобразование массива. Это преобразование адреса массива к unsigned long. точно, pool ведь содержит адрес первого элемента массива. тупанул. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 23:19 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
andron81 petrav andron81, Это не преобразование массива. Это преобразование адреса массива к unsigned long. точно, pool ведь содержит адрес первого элемента массива. тупанул. Нулевого элемента массива. И нет такой переменной pool, которая содержала бы адрес чего-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 23:26 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
andron81, Для справки, если у вас есть массив байтов которые вы хотите рассматривать как другой тип, то единственный способ это сделать без UB это memcpy() в отдельную переменную этого типа. Работать же напрямую, через преобразование типа - это UB. Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 11:13 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky andron81, Для справки, если у вас есть массив байтов которые вы хотите рассматривать как другой тип, то единственный способ это сделать без UB это memcpy() в отдельную переменную этого типа. Работать же напрямую, через преобразование типа - это UB. Код: plaintext 1. 2. 3. 4. 5. 6.
ого. да я смотрю вообще все эти преобразования это надо 20 раз подумать прежде чем делать. я почему спрашиваю в книге Эккеля разбирается перегрузка new и delete для классов. очень подробно разжовывать эккель не любит что делает в своих примера поэтому приходится догадываться. в общем как я понимаю он тут велосипедит new при помощи массива и держит массив с состоянием занят/не занят блок . а потом делает delete и вычисляет координату блока и помечает её как свободная. так вот там как раз это преобразование. Вы хотите сказать, что тут UB в delete ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:16 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky единственный способ это сделать без UB это memcpy() А как же union ? Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:19 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Dima T Anatoly Moskovsky единственный способ это сделать без UB это memcpy() А как же union ? Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Там тоже UB, как я понимаю. С++ такой язык — что не сделай UB. И выход один: пиши свой класс строк, потому что все этим занимаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:22 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
petrav Там тоже UB, как я понимаю. С++ такой язык — что не сделай UB. memcpy(), union и прочие вышеописанные попытки подменить один тип данных другим это не совсем UB, но работает только для POD типов . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:27 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Dima TА как же union ? Это UB в С++, но нормально в С. Поэтому компиляторы обычно молча применяют С-поведение, даже если исходник на С++. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:29 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Dima T А как же union ? Если можно pool обернуть в union, то да. Но не всегда возможно. petrav Там тоже UB, как я понимаю. Нет. С union нет UB если массив байтов содержит валидный объект который trivially-copyable (как в данном примере). Dima T memcpy(), union и прочие вышеописанные попытки подменить один тип данных другим это не совсем UB, но работает только для POD типов. Для не POD по-моему должно быть и так очевидно, что создавать объект побайтно нельзя. А для POD основная проблема которую решают memcpy и union это выравнивание. Есть платформы где нельзя в произвольном месте читать long и прочие типы. Поэтому UB если char* приводится к long* и разыменовывается, если там не было объекта такого типа. Но например так можно даже и для не POD: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:44 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyС union нет UB если массив байтов содержит валидный объект который trivially-copyable (как в данном примере). Это они одумались только в 14-м стандарте. https://en.cppreference.com/w/cpp/language/union The details of that allocation are implementation-defined but all non-static data members will have the same address (since C++14). It's undefined behavior to read from the member of the union that wasn't most recently written. Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 13:54 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Это они одумались только в 14-м стандарте. Ну, формально да. Но на практике я думаю что нет и никогда не было компиляторов которые бы не поддерживали алиасинг через union. Т.е. это стандарт дефакто. А вот reinterpret_cast (и c-cast) реально на некоторых платформах не работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 14:59 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Для справки, если у вас есть массив байтов которые вы хотите рассматривать как другой тип, то единственный способ это сделать без UB это memcpy() ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 10:39 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Для не POD по-моему должно быть и так очевидно, что создавать объект побайтно нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 10:43 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
a guest Единственный способ это std::bit_cast, а memcpy между объектами разных типов это UB. Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 11:28 |
|
преобразование массива к unsigned long
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky a guest Единственный способ это std::bit_cast, а memcpy между объектами разных типов это UB. Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 13:31 |
|
|
start [/forum/topic.php?fid=57&msg=40068000&tid=2017218]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 417ms |
0 / 0 |