гцц 64бит

Programs, sources, embedded, demomaking, whatsoever related to subj :)

Postby lvd » 18 Jun 2013, 10:31

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

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

Вопрос -- где у меня ошибка в днк? :)
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby fk0 » 18 Jun 2013, 10:35

Пиши 0LL или (size_t)c.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby lvd » 18 Jun 2013, 13:52

Ну, допустим, так помогло. Остаётся вопрос -- какого, собственно?
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby DimkaM » 18 Jun 2013, 15:03

lvd wrote:a = b[0-c];

a = *(b-c);
lvd wrote:Остаётся вопрос -- какого, собственно?
Нащёт отрицательных индексов что то не слышал
N>"Идите нахуй" со своей политикой...
DimkaM
 
Posts: 1011
Joined: 24 Mar 2010, 12:42
Location: г.Щёлково М.О.
Group: Registered users

Postby lvd » 18 Jun 2013, 15:53

DimkaM wrote:Нащёт отрицательных индексов что то не слышал

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

Вопрос к чему сводится, почему при вычислении индексов массивов не происходит кастинг всех участвующих чисел в 64 бита до вычислений (а не после).
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby DimkaM » 18 Jun 2013, 16:37

lvd wrote: a[b] -- то же самое, что b[a]

если a[] беззнаковочаровый, то да. В осталных случаях нет.
N>"Идите нахуй" со своей политикой...
DimkaM
 
Posts: 1011
Joined: 24 Mar 2010, 12:42
Location: г.Щёлково М.О.
Group: Registered users

Postby fk0 » 18 Jun 2013, 16:46

У тебя вначале вычисляется значение в квадратных скобках. Вычисляется оно по правилам языка 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", например.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby lvd » 18 Jun 2013, 18:01

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

Если a,b,c -- int, a=0,b=0x01000000,c=0x80000000, например, то и для знаковых алгебра не работает.
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby lvd » 18 Jun 2013, 18:02

fk0 wrote: Результат выражения -- uint32_t

То есь скоко бит в ращётах щитать, определяется не тем, что требуется в результате, а токо размерами самих аргументов?
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby deathsoft » 18 Jun 2013, 19:15

a = b[uint32_t(0-c)]; и будет тебе щастье, коли размер нуля не отличаешь, 0, 0U, 0L, 0LL, 0ULL -
это все разные вещи, также как char, signed char и unsigned char.
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Next

Return to Coding

Who is online

Users browsing this forum: No registered users and 9 guests

cron