Форум программистов, компьютерный форум CyberForum.ru

Как тут происходит перестановка байтов... - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 17:22     Как тут происходит перестановка байтов... #1
Вот в книге Шилдта 4-е издание... есть такой пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstdio>
#include <cstring>
#include <windows.h>
using namespace std;
 
union swap_byte
    {
      void swap();
      void set_byte(unsigned short i);
      void show_word();
      
      unsigned short u;
      unsigned char c[2];          
    };
 
void swap_byte::swap()
    {
     unsigned char t;
     t = c[0];
     c[0] = c[1];
     c[1] = t;                  
    }
 
void swap_byte::set_byte(unsigned short i)
   {
    u = i;
   }
 
void swap_byte::show_word()
  {
   cout<<u<<endl;                        
  }
  
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);  
  
  swap_byte a;
  
  a.set_byte(3);
  a.show_word();
  a.swap();
  a.show_word();
    
  system("pause");
  return 0;        
}
передаю параметром
1 выводит 256
2 выводит 512
3 выводит 768
8 выводит 2048

кто нибудь подскажет как это так происходит??
предполагается что число занимает 2 байта...
C++
1
char c[2];
перестановку вижу...

если вот число
0000 0000 0000 0001
то перестановка
0000 0001 0000 0000
так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 18:12     Как тут происходит перестановка байтов... #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
using namespace std;
 
union swap_byte
{
    void swap();
    void set_byte(unsigned short i);
    void show_word();
    void print();
 
    unsigned short u;
    unsigned char c[2];          
};
 
void swap_byte::swap()
{
    unsigned char t;
    t = c[0];
    c[0] = c[1];
    c[1] = t;                  
}
 
void swap_byte::set_byte(unsigned short i)
{
    u = i;
}
 
void swap_byte::show_word()
{
    cout<<u<<endl;                        
}
 
void print_byte(unsigned char x)
{
    for(size_t i=8;i;--i)
    {
        cout << ((x >> (i-1)) & 1); 
    }
 
    cout << " ";
}
 
void swap_byte::print()
{
    print_byte(((unsigned char*)&u)[0]);
    print_byte(((unsigned char*)&u)[1]);
    cout << endl;
}
 
 
int main()
{
    swap_byte a;
 
    a.set_byte(2);
    a.print();
    a.swap();
    a.print();
 
    cin.get();
    cin.get();
 
    return 0;        
}
Я добавил две функции. Теперь сам увидишь как происходит перестановка.
Хочу заметить что младшие байты хранятся по младшему адресу.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
26.08.2011, 18:15     Как тут происходит перестановка байтов... #3
если вот число
0000 0000 0000 0001
то перестановка
0000 0001 0000 0000
так?
да, все верно.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 18:19     Как тут происходит перестановка байтов... #4
Цитата Сообщение от morphling Посмотреть сообщение
0000 0000 0000 0001
Хочу заметить что это число 256.
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 18:35  [ТС]     Как тут происходит перестановка байтов... #5
Да спасибо уже разобрался... через калькулятор посмотрел 0000 0001 0000 0000 вывел 256...
еще в union все хранится в одном учаске памяти да? по самому большому... вот
если будет переменная типа
doubel (8 байт?)
и типа
int (4 байт)
и записать число в int
то она будет записанна в 8байт?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 18:59     Как тут происходит перестановка байтов... #6
Просто изменятся первые четыре бита double.
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 20:30  [ТС]     Как тут происходит перестановка байтов... #7
Цитата Сообщение от Overmind024 Посмотреть сообщение
Просто изменятся первые четыре бита double.
4 байта может?

тоесть если я
int x = 805306368 (11 0000 0000 0000 0000 0000 0000 0000)
то в памяти это будет как
0000 0000 0000 0000 0000 0000 00000 0000 0011 0000 0000 0000 0000 0000 00000 00000
?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 20:48     Как тут происходит перестановка байтов... #8
Да 4 байта.

Цитата Сообщение от morphling Посмотреть сообщение
то в памяти это будет как
Не так, а вот так:
0011 0000 0000 0000 0000 0000 00000 00000 0000 0000 0000 0000 0000 0000 00000 0000
Но это только в том случаи если там до этого были все нули, а это не обязательно.
Сыроежка
Заблокирован
26.08.2011, 21:14     Как тут происходит перестановка байтов... #9
Цитата Сообщение от morphling Посмотреть сообщение
Да спасибо уже разобрался... через калькулятор посмотрел 0000 0001 0000 0000 вывел 256...
еще в union все хранится в одном учаске памяти да? по самому большому... вот
если будет переменная типа
doubel (8 байт?)
и типа
int (4 байт)
и записать число в int
то она будет записанна в 8байт?
Это зависит от платформы, на которой вы запускаете программу. На 16-битовых платформах, как, например, MS-DOS, размер типа int составляет два байта. на 32-битовых платформах - 4 байта, а на 64-битовых платформах может составлять либо 4 байта, либо 8 байт.

Что касается вашего вопроса. то int будет записано только в тот раздел выделенной памяти для union, который соответствует размеру int, то есть в 4 байта.
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
27.08.2011, 00:14  [ТС]     Как тут происходит перестановка байтов... #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это зависит от платформы, на которой вы запускаете программу. На 16-битовых платформах, как, например, MS-DOS, размер типа int составляет два байта. на 32-битовых платформах - 4 байта, а на 64-битовых платформах может составлять либо 4 байта, либо 8 байт.

Что касается вашего вопроса. то int будет записано только в тот раздел выделенной памяти для union, который соответствует размеру int, то есть в 4 байта.
насчет платформ я знаю...
насчет ответа на мой вопрос спасибо понял щас...
вот еще например если я в переменную типа инт записал число
768....
потом к переменной типа doubl ПРИБАВЛЮ НЕ ПРИСВОЮ... то число переменная инт тоже увеличится??

int x = 768;
double y += 2;

вывод икса даст 770?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
27.08.2011, 00:22     Как тут происходит перестановка байтов... #11
Цитата Сообщение от morphling Посмотреть сообщение
int x = 768;
double y += 2;
вывод икса даст 770?
если все дело это в Union то нет, не выдаст. double хранится не так как int. Скорее всего будет что-то не совсем "адекватное". А скорее всего будет вообще 0 (когда double 8 байт, а int 4).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 01:39     Как тут происходит перестановка байтов...
Еще ссылки по теме:

Прием по modbus. Как указать число считываемых байтов C++
C++ Как можно теперь взять и собрать группу из 4-х байтов в один float?
Перестановка байтов в двоичном файле C++

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

Или воспользуйтесь поиском по форуму:
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
27.08.2011, 01:39     Как тут происходит перестановка байтов... #12
Числа с плавающей запятой хранятся при помощи мантиссы и порядка. Это очень похоже не экспонентную форму числа. 1.4 * 10^-4 это 0.00014.
Yandex
Объявления
27.08.2011, 01:39     Как тут происходит перестановка байтов...
Ответ Создать тему
Опции темы

Текущее время: 07:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru