как сохранить строку чисел в беззнаковое целое число в C

На самом деле мне нужно преобразовать аргументы команды, которые представляют собой три строки, в битовое поле (три целых числа без знака внутри). Эта программа будет преобразовывать биты в числа с плавающей запятой. Сначала я подумал об использовании массива для хранения трех аргументов, но я действительно не знаю, как преобразовать массив в целое число без знака. Должен ли я просто использовать atoi, чтобы изменить arg на int, а затем непосредственно на unsigned int? Это не слово на моем компьютере. Понятия не имею.

Union32 getBits(char *sign, char *exp, char *frac)
{
    Union32 new;

   // this line is just to keep gcc happy
   // delete it when you have implemented the function
   //new.bits.sign = new.bits.exp = new.bits.frac = 0;

   new.bits.sign = *(unsigned int *)atoi(sign);
   new.bits.exp = *(unsigned int *)atoi(exp);
   new.bits.frac = *(unsigned int *)atoi(frac);
   //int i ;
   //int balah[8] = {};
   //for(i = 0; i < 8; i++){
   //balah[i] = sign[i];
   //}

   //int j ;
   //int bili[23] = {};
   //for(j = 0; j < 23; j++){
      //bili[j] = sign[j];
   //}

   //convert array into unsigned integer?
   printf("%u %u %u\n", new.bits.sign, new.bits.exp, new.bits.frac);


   // convert char *sign into a single bit in new.bits

   // convert char *exp into an 8-bit value in new.bits

   // convert char *frac into a 23-bit value in new.bits
enter code here
   return new;
}

Ниже приведены подробности о typedef и union, которые необходимы в этой программе, а также о четырех функциях в этой программе.

typedef uint32_t Word;

struct _float {
   // define bit_fields for sign, exp and frac
   // obviously they need to be larger than 1-bit each
   // and may need to be defined in a different order
   unsigned int sign:1, exp:8, frac:23;
};
typedef struct _float Float32;

union _bits32 {
   float   fval;  // interpret the bits as a float
   Word    xval;  // interpret as a single 32-bit word
   Float32 bits;  // manipulate individual bits
};
typedef union _bits32 Union32;

void    checkArgs(int, char **);
Union32 getBits(char *, char *, char *);
char   *showBits(Word, char *);
int     justBits(char *, int);

getBits просит нас преобразовать биты в числа с плавающей запятой, а showBits просит нас преобразовать числа с плавающей запятой в биты.


person Fangyi Guo    schedule 08.08.2018    source источник
comment
Дайте мне пример кода использования функции getBits. Я думаю назвать это как: getBits("-1","+10","1.2349") для представления числа -1.2349E+10, это правильно?   -  person Sir Jo Black    schedule 08.08.2018
comment
Вы использовали (unsigned int *) там, где вы должны использовать (unsigned int). Но если я понял вашу мысль, код реализован неправильно.   -  person Sir Jo Black    schedule 08.08.2018
comment
Как определяется Union32!? Вы не можете хранить отдельное значение в union, вы должны использовать struct.   -  person Sir Jo Black    schedule 08.08.2018
comment
@SirJoBlack Я не думаю, что 1,2349 представляет собой целочисленное значение. Ваш пример плохой. Дайте более вменяемый.   -  person 0___________    schedule 08.08.2018
comment
@SirJoBlack, вероятно, это объединение структуры битового поля и других 32-битных данных. Как видите, две точки означают вложенную структуру или объединение.   -  person 0___________    schedule 08.08.2018
comment
Мой вопрос заключается в использовании функции! Как вы используете функцию? Приведите мне реальный пример вызова этой функции.   -  person Sir Jo Black    schedule 08.08.2018
comment
Нам нужно определение типа Union32, чтобы понять открытые точки.   -  person Sir Jo Black    schedule 08.08.2018


Ответы (1)


предполагая правильные определения типов в вашем коде:

   new.bits.sign = (unsigned int)atoi(sign);
   new.bits.exp = (unsigned int)atoi(exp);
   new.bits.frac = (unsigned int)atoi(frac);
person 0___________    schedule 08.08.2018