Инициализация массива с плавающей запятой с помощью memset

StackOverflow https://stackoverflow.com/questions/1040070

  •  22-07-2019
  •  | 
  •  

Вопрос

Это код, который я хочу попытаться написать:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

int main(int argc, char *argv[])
{
    float arry[3] = {0};

    memset(arry, (int) 10.0, 3*sizeof(float));

    return 0;
}

Моя проблема в том, что я хочу посмотреть, возможно ли использовать memset, чтобы каждая запись массива была числом, отличным от 0.Однако после перехода через эту строку содержимое массива изменяется на очень маленькое число (0).Интересно, что я делаю не так в этом случае с использованием функции memset().Я надеюсь, что это не дублирующий пост, поскольку ни один из предложенных связанных вопросов, когда я набираю это, похоже, не соответствует.

Это было полезно?

Решение

При преобразовании типа double к int просто создается двоичное число 00001010 (10 в двоичном формате), и это значение, которое задано в memset'е. Поскольку это символ, каждый из ваших чисел с плавающей точкой получает битовую комбинацию 00001010 00001010 00001010 00001010.

Другие советы

Memset принимает int, но переводит его в неподписанный символ, и затем заполняет каждый байт с плавающей точкой (sizeof (float), вероятно, 4) с этим битовым шаблоном. Если это C ++, вместо этого выберите заливку :

#include <algorithm>
using namespace std;

//...

fill (arry,arry+3,10.0);

Нет.memset принимает один байт и записывает его в массив.Float - это многобайтовый тип.

Редактировать:Да, я знаю, что memset принимает значение int.Но для заполнения он использует только символ без знака (один байт).

Почему бы не просто цикл for ?

На самом деле ваша попытка немного вводит в заблуждение, memset работает с байтами ... на самом деле использование значения float для значения memset не имеет никакого смысла!

Формат с плавающей запятой имеет только 23 + 1 бит для мантиссы и 8 бит для экспоненты. Когда вы записываете необработанные байтовые значения (используя memset) внутри плавающей запятой, вы не знаете, что получаете, потому что вы устанавливаете значения, которые будут быть интерпретированным по-другому!

В своем фрагменте вы также приводите его к (int), превращая 4-байтовое число с плавающей запятой, содержащее 10,0f, в 4-байтовое целое число, содержащее значение 10 .. но, как уже было сказано, если вы устанавливаете значение с плавающей запятой с 10 (= 0x0a) в итоге вы получите 0x0A0A0A0A, который не равен 10.0f в формате с плавающей запятой, это может быть любое значение (также что-то очень близкое к 0, как в вашем случае).

На самом деле memset полезен, когда вы хотите инициализировать массив символов (поскольку вы эффективно получаете это значение для каждого символа, потому что они имеют длину 1 байт) или когда вы хочу установить все в 0 (NULL), который работает для всех основных типов данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top