Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.182.39] |
|
Сообщ.
#1
,
|
|
|
Какая функция преобразовывает DWORD в char* или char?
|
Сообщ.
#3
,
|
|||||||||
|
Вообще-то никакая. Для начала определимся, что такое DWORD. Под Win32 это typedef на unsigned long Как гласит стандарт (4/1) для встроенных типов существуют стандартные преобразования. Таким образом, преобразование unsigned long к char происходит неявно, без лишних телодвижений:
При этом происходит integral conversion, последствия которого, в общем случае, inplementation defined. Для случая, когда sizeof( unsigned long ) == 4, а char - беззнаковый, будет происходить обрезание битовой последовательности исходного значения (4.7/2). (для платформы x86 сохранятся только младшие 8 бит: 0x1234 -> 0x34 ). Если же char знаковый, то, как сказано в 4.7/3, результат inplementation defined. В нашем случае мы получим такое же обрезание. (0x1234 -> 0x34) Стандартного преобразования DWORD к указателю char* (integral type к pointer type) нет. Это вообще небезопасная штука. Поэтому, если очень нужно, то следуется воспользоваться явным преобразованием, которое может иметь три формы: 1. С++ cast
2. functional notation имеет вид T( x1, x2, ... ) -- здесь не прокатит, так как у нас T это char* и запись char*( ul ) ошибочна. 3. cast notation ( также известен как C-style )
Лучше таких преобразований вообще не делать: легко наступить на грабли. Но если есть 100% уверенность, что sizeof( char* ) == sizeof( DWORD ), а само значение DWORD является валидным указателем, тогда можно, только осторожно, с пониманием того, что делаешь. Причем лучше пользоваться reinterpret_cast. |