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

  • Автор темы Folderx
  • Дата начала
F

Folderx

Гость
#1
Код:
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

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

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

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

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

Код:
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 ?
 

Normann

Well-Known Member
09.08.2007
168
2
#2
Покажи весь код, а то так ниче не понятно. А на счет последнего то там все вроде правильно выходит.
 
F

Folderx

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

Normann

Well-Known Member
09.08.2007
168
2
#4
Еще раз говорю покажи код, у тебя не понятно что где должно быть.
И интересно как же эти числа там в шестнадцатеричной системе кладутся? А я то дурак думал что моя машина работает с двоичной <_<
Все проще пареной репы, не парься - один символ это один байт, целое это два байта, когда ты смотришь на память через твой string то програма показывает тебе один байт, а когда ты смотришь через digit то программа показывает сразу два байта причем для получения digit она извлекает их в обратном порядке.
 
P

Pasha

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

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#6
Для: Normann
Folderx
следует различать понития число и способ его представления

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

Normann

Well-Known Member
09.08.2007
168
2
#7
<!--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?
 
P

Pasha

Гость
#8
<!--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 скомпилирован...
 
04.09.2006
2 566
2
Минск
#9
<!--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]
В таких вопросах совета надо у компилятора спрашивать, а не у некоего авторитета
 
F

Folderx

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

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

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

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

Pasha

Гость
#11
Для: Folderx
Union нельзя использовать для конвертации, только для хранения данных, потому что никто заранее не знает как компилятор расположит данные в нем. В твоем случае, судя по результатам, получилось примерно так (int-ы записаны побайтно, от младших к старшим, память обнулена, потому что ты запускаешь отладочный вариант)
Код:
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]
После записи '.'
Код:
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
Код:
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.