Union сохраняет не все значения

Тема в разделе "Общие вопросы по С и С++", создана пользователем Folderx, 16 сен 2007.

  1. Folderx

    Folderx Гость

    Код (Text):
    union strings_and_digits
    {
    char string1[5];
    char string2[10];
    int digit1[5];
    int digit2[10];
    }char_int_array;


    char_int_array.string1[0] = '.';
    printf выводит: . . 46 46

    То есть все нулевые элементы всех массивов поменялись, дальше

    Код (Text):
    char_int_array.string1[1] = '*';     
    char_int_array.digit1[1] = 144;
    printf выводит: * * 144 144

    То есть первые элементы поменялись в соответствии с типами, целые к целым, строковые к строковым, пока всё ровно, дальше

    Код (Text):
    printf("%s %s\n", char_int_array.string1, char_int_array.string2);
    printf выводит: .* .*

    Код (Text):
    printf("%d %d %d %d\n\n",
    char_int_array.digit1[0],
    char_int_array.digit1[1],
    char_int_array.digit2[0],    
    char_int_array.digit2[1]
    );
    printf выводит: 10798 144 10798 144

    Короче вот эти цифры(числа) 10798, почему они не 46 ?
     
  2. Normann

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    Покажи весь код, а то так ниче не понятно. А на счет последнего то там все вроде правильно выходит.
     
  3. Folderx

    Folderx Гость

    Мне нужно было узнать почему выходит 10798 144 10798 144 а не 46 144 46 144 , вроде Pasha разъяснил в соседнем топике(я не проверял), что типа байты кладутся в 16ричном виде и число 10798 это два 16ричных числа, ну которые в 10ричной системе равны 46 каждое. Короче они записывают вместе и получается вот такая бодяга 10798.
     
  4. Normann

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    Еще раз говорю покажи код, у тебя не понятно что где должно быть.
    И интересно как же эти числа там в шестнадцатеричной системе кладутся? А я то дурак думал что моя машина работает с двоичной <_<
    Все проще пареной репы, не парься - один символ это один байт, целое это два байта, когда ты смотришь на память через твой string то програма показывает тебе один байт, а когда ты смотришь через digit то программа показывает сразу два байта причем для получения digit она извлекает их в обратном порядке.
     
  5. Pasha

    Pasha Гость

    Для: Normann
    Не было в соседнем топике ничего про шестнадцатиричную систему <_< Про байты - было. И, кстати, int-ы уже довольно давно по 4 байта стали.
     
  6. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    Для: Normann
    Folderx
    следует различать понития число и способ его представления

    а размер int платформа зависим, мне попадались компиляторы с размаром int в 24 бита.
     
  7. Normann

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    <!--QuoteBegin-Pasha+25:09:2007, 14:27 -->
    <span class="vbquote">(Pasha @ 25:09:2007, 14:27 )</span><!--QuoteEBegin-->И, кстати, int-ы уже довольно давно по 4 байта стали.
    [snapback]79488" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    У Фолдерикса они по два байта

    <!--QuoteBegin-Kmet+25:09:2007, 16:44 -->
    <span class="vbquote">(Kmet @ 25:09:2007, 16:44 )</span><!--QuoteEBegin-->Для: Normann
    Folderx
    [snapback]79504" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Это ко мне адресовано или к Folderx?
     
  8. Pasha

    Pasha Гость

    <!--QuoteBegin-Normann+25:09:2007, 22:31 -->
    <span class="vbquote">(Normann @ 25:09:2007, 22:31 )</span><!--QuoteEBegin-->У Фолдерикса они по два байта
    [snapback]79540" rel="nofollow" target="_blank[/snapback]​
    [/quote]Никто точно не знает по сколько они у него байт. К string1[2] он не обращался, код мог быть в debug скомпилирован...
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Normann+25:09:2007, 22:31 -->
    <span class="vbquote">(Normann @ 25:09:2007, 22:31 )</span><!--QuoteEBegin-->У Фолдерикса они по два байта
    [snapback]79540" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    В таких вопросах совета надо у компилятора спрашивать, а не у некоего авторитета
     
  10. Folderx

    Folderx Гость

    Да это и есть весь код, выше только main

    sizeof(int) 4 у меня, sizeof(char) 1

    <!--QuoteBegin-Normann+-->
    <span class="vbquote">(Normann)</span><!--QuoteEBegin-->И интересно как же эти числа там в шестнадцатеричной системе кладутся? А я то дурак думал что моя машина работает с двоичной[/quote]
    Да это понятно, 16ричная двоичная разницы нет он там переведёт если что, вот непонятно откуда число 10798, потому что 46 - это 2E, а 2E2E - это 11822, то есть даже если он их сливает в одно число то не сходится всё равно.

    Я хотел сделать так union установил какой-нибудь, там переменные разных типов, одну поменял(одного типа), другие чтобы тоже поменялись(другого типа), не знаю для чего мне это надо, но для чего-то надо потом будет, я мечтал короче чтобы например ввёл строку(а она в юнионе каком-нибудь прицеплена к числовой переменной) и раз она сразу в цифрах у меня, а с цифрами уже там можно работать как-нибудь, или вот проблема есть типа как заполнить быстро массив символов, без циклов, я хотел как-нибудь юнион использовать в этом деле, напрямую массив записать через память.
     
  11. Pasha

    Pasha Гость

    Для: Folderx
    Union нельзя использовать для конвертации, только для хранения данных, потому что никто заранее не знает как компилятор расположит данные в нем. В твоем случае, судя по результатам, получилось примерно так (int-ы записаны побайтно, от младших к старшим, память обнулена, потому что ты запускаешь отладочный вариант)
    Код (Text):
    string1 [0x00] [0x00] [0x00] [0x00] [0x00]
    digit1 [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00]
    После записи '.'
    Код (Text):
    string1 [0x2E] [0x00] [0x00] [0x00] [0x00]
    digit1 [0x2E  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00]
    После записи '*' и 144
    Код (Text):
    string1 [0x2E] [0x2A] [0x00] [0x00] [0x90]
    digit1 [0x2E  0x2A  0x00  0x00] [0x90  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00] [0x00  0x00  0x00  0x00]
    [0x2E 0x2A 0x00 0x00] - это 0x00002A2E, оно же 10798.
     
Загрузка...

Поделиться этой страницей