LINUX.ORG.RU

guint64, >>, & (сдвиг и лог.И)


0

0

Господа, объясните плиз мне, темному... где грабли? в упор не вижу.

вот есть такой код:

GSQL_DEBUG ("format parsed: %s", dt_format_parsed);
	GSQL_DEBUG ("DateTime: %llu", dt->dt);

	GSQL_DEBUG ("shift: [%d] value[%llu] mask[%d] value [%d]", dt_ms[0].shift, dt->dt >> dt_ms[0].shift,
				dt_ms[0].mask, dt->dt >> dt_ms[0].shift & (dt_ms[0].mask));
	
	GSQL_DEBUG ("shift: [%d] value[%llu] mask[%d] value [%d]", dt_ms[1].shift, dt->dt >> dt_ms[1].shift,
				dt_ms[1].mask, (dt->dt >> dt_ms[1].shift) & dt_ms[1].mask);
	GSQL_DEBUG ("shift: [%d] value[%llu] mask[%d] value [%d]", dt_ms[2].shift, dt->dt >> dt_ms[2].shift,
				dt_ms[2].mask, (dt->dt >> dt_ms[2].shift) & dt_ms[2].mask);
	GSQL_DEBUG ("shift: [%d] value[%llu] mask[%d] value [%d]", dt_ms[3].shift, dt->dt >> dt_ms[3].shift,
				dt_ms[3].mask, (dt->dt >> dt_ms[3].shift) & dt_ms[3].mask);
	GSQL_DEBUG ("shift: [%d] value[%llu] mask[%d] value [%d]", dt_ms[4].shift, dt->dt >> dt_ms[4].shift,
				dt_ms[4].mask, (dt->dt >> dt_ms[4].shift) & dt_ms[4].mask);
	GSQL_DEBUG ("shift: [%d] value[%llu] mask[%d] value [%d]", dt_ms[5].shift, dt->dt >> dt_ms[5].shift,
				dt_ms[5].mask, (dt->dt >> dt_ms[5].shift) & dt_ms[5].mask);

	f_tmp = g_strdup_printf (dt_format_parsed, (dt->dt >> dt_ms[0].shift) & dt_ms[0].mask,
					   (dt->dt >> dt_ms[1].shift) & dt_ms[1].mask,
					   (dt->dt >> dt_ms[2].shift) & dt_ms[2].mask,
					   (dt->dt >> dt_ms[3].shift) & dt_ms[3].mask,
					   (dt->dt >> dt_ms[4].shift) & dt_ms[4].mask,
					   (dt->dt >> dt_ms[5].shift) & dt_ms[5].mask);
	GSQL_DEBUG ("f_tmp: %s", f_tmp);


а вот его выхлоп:

** (lt-gsql:11477): DEBUG: format parsed:  %02d/%02d/%d %02d:%02d:%02d
** (lt-gsql:11477): DEBUG: DateTime: 13200622476056071035
** (lt-gsql:11477): DEBUG: shift: [18] value[50356378463959] mask[63] value [0]
** (lt-gsql:11477): DEBUG: shift: [24] value[786818413499] mask[15] value [0]
** (lt-gsql:11477): DEBUG: shift: [28] value[49176150843] mask[65535] value [0]
** (lt-gsql:11477): DEBUG: shift: [12] value[3222808221693376] mask[63] value [0]
** (lt-gsql:11477): DEBUG: shift: [6] value[206259726188376109] mask[63] value [0]
** (lt-gsql:11477): DEBUG: shift: [0] value[13200622476056071035] mask[63] value [0]
** (lt-gsql:11477): DEBUG: f_tmp:  23/00/11 00:33595:00


есть 3 вопроса:
намба раз - почему value [0], т.е. значение = 0?

намба два - при все при этом, этот же сдвиг и наложение маски в f_tmp кладут цифры отличные от ноля?

намба три - в каком месте я наступил на грабли?

зыЖ

dt - есть такой тип:

union _GSQLTypeDateTime
{
	struct
	{
		guint  sec:6;
		guint  min:6;
		guint  hour:6;
		guint  day:6;
		guint  mon:4;
		guint  year:16;
	
		GSQLTypeDateTime_type dt_type:2;
	
		guint  _align64:18;
	} datetime;
	guint64 dt;	
};

в эту структуру заложил вот такую дату:

	test.datetime.year = 2099;
	test.datetime.mon = 11;
	test.datetime.day = 23;
	test.datetime.hour = 0;
	test.datetime.min = 45;
	test.datetime.sec = 59;
Deleted

Вопросы решены.

Обрисую в нескольких словах... Граблей было несколько.

Грабли намба раз - забыл-таки обнулить test (там где test.datetime.year = 2099;). Хотя в принципе это не критично.

Грабли намба два - это сраное выравнивание структур (бляха, ведь не раз же наблюдал со стороны как люди на это наступают)... 

union _GSQLTypeDateTime
{
	struct
	{
		guint  sec:6;
		guint  min:6;
		guint  hour:6;
		guint  day:6;
		guint  mon:4;
>>>>>>>> в этом месте компилятор решил выровнять до 32 бит, соотв-но
год у меня был уже не на 28 сдвиге, а на 32.
		guint  year:16;
	
		GSQLTypeDateTime_type dt_type:2;
	
		guint  _align64:18;
	} datetime;
	guint64 dt;	
};


грабли намба три - 

f_tmp = g_strdup_printf (dt_format_parsed, (dt->dt >> dt_ms[0].shift) & dt_ms[0].mask,
					   (dt->dt >> dt_ms[1].shift) & dt_ms[1].mask,
					   (dt->dt >> dt_ms[2].shift) & dt_ms[2].mask,
					   (dt->dt >> dt_ms[3].shift) & dt_ms[3].mask,
					   (dt->dt >> dt_ms[4].shift) & dt_ms[4].mask,
					   (dt->dt >> dt_ms[5].shift) & dt_ms[5].mask);

в переменной dt_format_parsed у меня хранится строка вида "%02d/%02d/%d %02d:%02d:%02d". Даже кастование 
(guint) (dt->dt >> dt_ms[0].shift) & dt_ms[0].mask не давало результата. а вот так заработало:

guint a0, a1, a2, a3, a4, a5;

f_tmp = g_strdup_printf (dt_format_parsed, a0 =(dt->dt >> dt_ms[0].shift) & dt_ms[0].mask,
					   a1 = (dt->dt >> dt_ms[1].shift) & dt_ms[1].mask,
					   a2 =(dt->dt >> dt_ms[2].shift) & dt_ms[2].mask,
					   a3 =(dt->dt >> dt_ms[3].shift) & dt_ms[3].mask,
					   a4 =(dt->dt >> dt_ms[4].shift) & dt_ms[4].mask,
					   a5 =(dt->dt >> dt_ms[5].shift) & dt_ms[5].mask);

Вобщем контрольным выстрелом для меня было вот это - "if you use bitfields, forget about portability!" 

хотелось сэкономить место и количество движений, но в результате, в перспективе, получаются грабли нехилой величины 
под каждую архитекутру.

Александр, спасибо, что помог разобраться!

Deleted
()

Пардон, но: еще один гребанный оптимизатор.

ShprotX
()

Компильте с -Os, а вообще такие "оптимизации" нафиг не нужны. Как и сдвиги вместо умножения/деления на степени двойки, и прочие подобные костыли. Оптимизирующий компилятор вполне способен позаботится о таких мелочах сам.

svr4
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.