С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

double - C++

04.07.2012, 17:37. Просмотров 1172. Ответов 21
Метки нет (Все метки)

Если преобразовать double к char*, то какие байты будут отвечать за целую часть, а какие за дробную?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2012, 17:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос double (C++):

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include <iostream> #include <cmath> using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

Исправить ошибки "cannot convert 'double (*)(double)' to 'double'" и "too many arguments to function" - C++
пожалуйста проверьте и помогите исправить ошибки: #include<iostream> #include<stdio.h> #include<math.h> #include<stdlib.h> ...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

21
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
04.07.2012, 17:56 #2
Не так просто... Числа типа double хранятся в виде двух битовых полей мантиссы (нормализованная дробная часть) и двоичного порядка.
0
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 17:57 #3
Не совсем понял, но привести число к указателю на char? Так компилятор не даст скорее всего.
C++
1
2
3
4
5
double var = 30;
char *p = "O";
 
p = var;    // тут ругнется при компиляции
*p = var;  // тут выдаст предупреждение и потом может вообще упасть
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
04.07.2012, 17:58  [ТС] #4
cppGhost,
C++
1
2
3
double val; 
char* p; 
p = (char*)&val;
0
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
04.07.2012, 17:58 #5
Компилятор даст, если сделать правильно...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    double x=111.111;
    char *c;
 
    c= (char *) &x;
 
    printf("%d\n",c[0]);
    printf("%d\n",c[1]);
    printf("%d\n",c[2]);
    printf("%d\n",c[3]);
    printf("%d\n",c[4]);
    printf("%d\n",c[5]);
    printf("%d\n",c[6]);
    printf("%d\n",c[7]);
 
    return 0;
}
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
04.07.2012, 18:00  [ТС] #6
Catstail, понятно. Значит в это лучше не лезть?
0
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
04.07.2012, 18:06 #7
Вовсе нет! Это по-своему интересно! Понимая, как хранятся числа с плав. точкой, ты всегда сможешь (если захочешь) построить программную плавающую арифметику на любой платформе. Или построить свою арифметику сверхвысокой точности. Лишних знаний не бывает!
0
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:07 #8
Хорошо, так компилятор даст
C++
1
p = (char*)&val;
но что мы тут делаем. адрес переменной типа double подставляем в указатель типа char. double 8 байт, char 1. кстати, проверил MSVS 2008, в p нет ожидаемого значения.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
04.07.2012, 18:09  [ТС] #9
cppGhost, это даст побайтовое представление переменной. попробуй с int
0
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:22 #10
хм, а как с int будет представляться число 257, скажем, если char* 1 байт?
не, может я просто знаю условие задачи, ради которой это все тут началось. с другой стороны для себя кое-что новое узнал, спасибо )

Добавлено через 1 минуту
Кстати, с float тоже не работает, хотя как и int те же 4 байта

Добавлено через 2 минуты
Да и вообще не понятно. Вот есть char *p, он знает, что значение лежит по адресу: p + sizeof(char). Мы даем ему адрес переменной типа int, как он определит, что нужно брать уже sizeof(int)?
0
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
04.07.2012, 18:30 #11
Смотри. Берем код:

C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    int x=234;
    unsigned char *c;
    c= (unsigned char *) &x;
    printf("%2x\n",c[0]);
    printf("%2x\n",c[1]);
    return 0;
}
Запускаем. И видим вывод:

ea
0

Разберемся. Для начала переведем 234 в 16-ричную систему. Получаем 23410=00EA16. Теперь нужно вспомнить, что в интеловских процессорах принят обратный порядок байтов. Поэтому у нас и получилось EA00, что для человека означает 00EA.

А если подставить x=-234. То вывод будет:

16
FF

Что сие значит? Отрицательные числа хранятся в дополнительном коде. Он получается так: сначала берем исходное число и заменяем нули единицами, единицы - нулями (инверсия битов). Из 00EA получится FF15. А потом добавляем единицу к младшему разряду.
Получаем FF16. В памяти байты переставляются, вот и получается 16FF. Все понятно?
1
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:37 #12
C++
1
printf("%2x\n",c[1]);
а вот это что такое? я ведь могу написать и
C++
1
printf("%2x\n",c[2]);
и будет тоже 0. я просто к тому, что если число, лежащее в int Больше 255, то никакой c[0]...c[1]...c[2] не отобразит исходное число. или я не прав?
0
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
04.07.2012, 18:46 #13
В моей системе тип int имеет длину 4 байта. Поэтому c[0],c[1],c[2],c[3] будут частями нашего int. А вот с[4] уже к числу не относится.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdio.h"
 
int main(int argc, char* argv[])
{
   int x=-234;
   unsigned char *c;
   printf("Size of int=%d\n",sizeof(int));
   с= (unsigned char *) &x;
   printf("%2x\n",c[0]);
   printf("%2x\n",c[1]);
   printf("%2x\n",c[2]);
   printf("%2x\n",c[3]);
 
   printf("%2x\n",c[4]); // напечаться может что угодно...
 
   return 0;
}
0
Миниатюры
double  
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
04.07.2012, 18:50 #14
Цитата Сообщение от cppGhost Посмотреть сообщение
я просто к тому, что если число, лежащее в int Больше 255, то никакой c[0]...c[1]...c[2] не отобразит исходное число.
Отобразит... Значение же не будет копироваться в переменную типа char. Указатель и индексация тут используются просто для доступа к отдельным байтам исходного значения.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
 
int main(int argc, char* argv[])
{
    int x = 30000;
    unsigned char *c;
    c = (unsigned char *) &x;
    
    for(int i = 0; i < sizeof(int); ++i)
    {
        printf("%2x\n",c[i]);
    }
    
    return 0;
}
0
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:51 #15
вот у вас
Цитата Сообщение от Catstail Посмотреть сообщение
int x=-234;
число отрицательное, это специально? просто если заменить на

Цитата Сообщение от Catstail Посмотреть сообщение
int x=400;
, то мы не получим в выводе побайтовые значения
0
04.07.2012, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2012, 18:51
Привет! Вот еще темы с ответами:

Какая-нибудь реализация функции void Fun (double in, double *out) - C++
Подскажите, пожалуйста, какую-нибудь любую реализацию прототипа функции: void Fun (double in, double *out)

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей - C++
Здравствуйте все знают что в VC long double и double одно и тоже, да и при простой проверке это легко выясняется, но нужна информация от...

std::copy из vector<double> в *double, непонятный warning - C++
double myD={10,20,30,40,50,60,70}; std::vector&lt;double&gt; myvector (7); std::copy ( myD, myD+7, myvector.begin() ); std::copy (...

invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’ - C++
#include &quot;mpi.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #define count 120 int main(int argc,char *argv) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.