2016-08-03 5 views
0

У меня есть int64_t value1; int32_t value2;. Тогда у меня есть *(int32_t*)&value1 = value2;Сложный литье с int64 и int32 указателями

Не могли бы вы описать, что означает *(int32_t*)&value1? Означает ли это «наименьшие 32 бита значения1», поэтому *(int32_t*)&value1 = value2; означает, что «первые 32 бита значения1 заменены значениями, равными значению 2»?

Или я совершенно не прав?

+0

Речь идет о контенте. Об этом было так много вопросов –

ответ

0

Это будет зависеть от порядка байтов машины, на которой он работает. Это довольно плохая практика. В маленькой системной системе, которая является большинством аппаратных средств Intel, сначала используется младший байт, поэтому 32-разрядное значение SIGNED будет записано в младшие 32 бита из 64-битного целого числа. В системе большого конца она будет записана в биты высокого порядка.

Обратите внимание, что int подписан. Если value2 является отрицательным значением, полученное 64-битное число не будет отрицательным (если оно уже не было отрицательным).

Он также не изменит биты высокого порядка 64-битного int.

Я бы сказал ... не делайте этого?

EDIT Чтобы более точно ответить на ваш вопрос, да, вы правы, в зависимости от того, что вы подразумеваете под «первыми 32 битами». Сначала в любом порядке, который использует платформа, да.

&value1 -> will give the address of value1 
(int32_t*)&value1 -> tells the compiler to treat the address of value1 as a pointer to an int32_t 
*(int32_t*)&value1 -> then dereference the pointer, so assigning to this will put the assigned value into the address of value1 as if it were an int32_t.