Подтвердить что ты не робот

Что такое эквивалент C для reinterpret_cast?

Что такое C-эквивалент для reinterpret_cast из С++?

4b9b3361

Ответ 1

int *foo;
float *bar;

// c++ style:
foo = reinterpret_cast< int * >(bar);

// c style:
foo = (int *)(bar);

Ответ 2

Стили C-стиля просто напоминают имена типов в скобках:

void *p = NULL;
int i = (int)p; // now i is most likely 0

Очевидно, что лучше использовать для трансляции, чем этот, но это основной синтаксис.

Ответ 3

Это не существует, потому что reinterpret_cast не может изменить [constness] [3]. Например,

int main()
{
    const unsigned int d = 5;
    int *g=reinterpret_cast< int* >( &d );
    (void)g;
}

приведет к ошибке:

dk.cpp: В функции 'int main()':
   dk.cpp: 5: 41: error: reinterpret_cast от типа 'const unsigned int *' для ввода 'int *' отбрасывает квалификаторы

Ответ 4

Листинг C-стиля:

int* two = ...;
pointerToOne* one = (pointerToOne*)two;

Ответ 5

Если вы можете взять адрес значения, одним из способов является указание указателя на него указателю на другой тип, а затем разыменовать указатель.

Например, преобразование float-to-int:

int main()
{
  float f = 1.0f;

  printf ("f is %f\n", f);
  printf ("(int) f is %d\n", (int)f);
  printf ("f as an unsigned int:%x\n", *(unsigned int *)&f);
}

Вывод:

f is 1.000000
(int) f is 1
f as an unsigned int:3f800000

Обратите внимание, что это, вероятно, не гарантируется работой по стандарту C. Вы не можете использовать reinterpret_cast для преобразования из float в int в любом случае, но он был бы похож на тип, который поддерживался (например, между разными типами указателей).

Пусть подтверждают, что вывод выше имеет смысл, во всяком случае.

http://en.wikipedia.org/wiki/Single_precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32

Последний ответ в двоичном формате:

0011 1111 1000 0000 0000 0000 0000 0000

Это формат с плавающей запятой IEEE-754: знаковый бит 0, за которым следует 8-битный показатель (011 1111 1), за которым следует 23-битная мантисса (все нули).

Чтобы интерпретировать экспоненту, вычтите 127: 01111111b = 127 и 127 - 127 = 0. Показатель равен 0.

Чтобы интерпретировать мантиссу, напишите ее после 1, за которой следует десятичная точка: 1.00000000000000000000000 (23 нуля). Это 1 в десятичной форме.

Следовательно, значение, представленное hex 3f800000, равно 1 * 2 ^ 0 = 1, как мы и ожидали.

Ответ 6

Вы можете свободно вводить типы указателей в C, как и любой другой тип.

Чтобы быть полным:

void *foo;
some_custom_t *bar;
other_custom_t *baz;
/* Initialization... */
foo = (void *)bar;
bar = (some_custom_t *)baz;
baz = (other_custom_t *)foo;

Ответ 7

Как насчет оператора REINTERPRET для c:

#define REINTERPRET(new_type, var) ( * ( (new_type *)   & var ) )

Я не люблю говорить "reinterpret_cast", потому что cast означает преобразование (в c), в то время как переинтерпрет означает противоположное: никакого преобразования.