Page 1 of 2

гцц 64бит

PostPosted: 18 Jun 2013, 10:31
by lvd
пейшу:
a = b[0-c];
где c - uint32_t
b - массив, который продолжаецо взад на столько, насколько нужно.

Чо вижу: береццо 32битный инт, делается neg eax, получается число в районе 4 миллиардов в rax регистре и закономерный сегфолт.

Вопрос -- где у меня ошибка в днк? :)

Re: гцц 64бит

PostPosted: 18 Jun 2013, 10:35
by fk0
Пиши 0LL или (size_t)c.

Re: гцц 64бит

PostPosted: 18 Jun 2013, 13:52
by lvd
Ну, допустим, так помогло. Остаётся вопрос -- какого, собственно?

Re: гцц 64бит

PostPosted: 18 Jun 2013, 15:03
by DimkaM
lvd wrote:a = b[0-c];

a = *(b-c);
lvd wrote:Остаётся вопрос -- какого, собственно?
Нащёт отрицательных индексов что то не слышал

Re: гцц 64бит

PostPosted: 18 Jun 2013, 15:53
by lvd
DimkaM wrote:Нащёт отрицательных индексов что то не слышал

Ну так как пишуть в стандартах, a[b] -- то же самое, что b[a] и то же самое, что *(a+b).

Вопрос к чему сводится, почему при вычислении индексов массивов не происходит кастинг всех участвующих чисел в 64 бита до вычислений (а не после).

Re: гцц 64бит

PostPosted: 18 Jun 2013, 16:37
by DimkaM
lvd wrote: a[b] -- то же самое, что b[a]

если a[] беззнаковочаровый, то да. В осталных случаях нет.

Re: гцц 64бит

PostPosted: 18 Jun 2013, 16:46
by fk0
У тебя вначале вычисляется значение в квадратных скобках. Вычисляется оно по правилам языка C для используемых там типов... А потом полученное значение приводится к ssize_t и используется как индекс массива. Во всех 64-бит дата моделях ssize_t или ptrdiff_t (чё там для индексов используется, не знаю) будет 64-битным. Ты пишешь 0-(uint32_t)c. Результат выражения -- uint32_t, число близкое к 4-м миллиардам. Согласен? А теперь приведём его (побитово) к 64-битовому знаковому. Будь у нас на входе знаковое число -- привелось бы нормально. А беззнаковое -- sign expansion в машинных командах делаться не будет и старшие разряды останутся нулевыми. Полная хуйня!

Почему так? Потому, что за бездумное использование беззнаковых чисел везде где попало, в частности в индексах, я считаю, сжигать нужно. По таким вот причинам. Или по таким, что для беззнаковых чисел алгебра не работает. Из "a+b > c" не следует "a > c-b", например.

Re: гцц 64бит

PostPosted: 18 Jun 2013, 18:01
by lvd
fk0 wrote:Или по таким, что для беззнаковых чисел алгебра не работает. Из "a+b > c" не следует "a > c-b", например.

Если a,b,c -- int, a=0,b=0x01000000,c=0x80000000, например, то и для знаковых алгебра не работает.

Re: гцц 64бит

PostPosted: 18 Jun 2013, 18:02
by lvd
fk0 wrote: Результат выражения -- uint32_t

То есь скоко бит в ращётах щитать, определяется не тем, что требуется в результате, а токо размерами самих аргументов?

Re: гцц 64бит

PostPosted: 18 Jun 2013, 19:15
by deathsoft
a = b[uint32_t(0-c)]; и будет тебе щастье, коли размер нуля не отличаешь, 0, 0U, 0L, 0LL, 0ULL -
это все разные вещи, также как char, signed char и unsigned char.