LINUX.ORG.RU

Преобразование void* ->int на x86_64


0

0

gcc отказывается компилировать на x86_64 конструкции типа reinterpret_cast<int>(some_void_ptr) (говорит "error: cast from 'void*' to 'int' loses precision"). Опытным путём было установлено, что в long он конвертирует нормально. Но: разве разрядность int не должна соответствовать разрядности системы, т. е. в случае i386 быть равной 32 битам и совпадать с long, а в случая x86_64 составлять 64 бита и совпадать с long long и с размером указателя? Почему же gcc тут находит какую-то потерю точности?

★★

i@lorn ~ % cat test.c
int main (){
        printf("%d\n", sizeof(int));
        printf("%d\n", sizeof(long));
        printf("%d\n", sizeof(void *));
}
pi@lorn ~ % ./test
4
8
8
pi@lorn ~ % uname -a
Linux lorn 2.6.16-rc5lorn #3 PREEMPT Sun Mar 12 13:57:35 EET 2006 x86_64 AMD Turion(tm) 64 Mobile Technology ML-30 GNU/Linux

Pi ★★★★★
()

> разве разрядность int не должна соответствовать разрядности системы?

Нет. В частности, на x86_64 размерность int - 32 бита.

man stdint.h

ero-sennin ★★
()

стандартом запамятовал чего (нето C, нето SUS) предписано как раз совпадение размеров (long) и (void*). Вернее, насколько я помню, гарантируется, что long foo = (long)(&blah) работает верно. Плюсы в этом смысле не отличаются.

А про инт сказано, что он >= char, >= short, но <= long.

anonymous
()

слишком много кода полагается на sizeof(int)==4, поэтому большинство компиляторов на разных платформах пытаются этому требованию удволетворить

fghj ★★★★★
()
Ответ на: комментарий от fghj

имхо компилятор не должен стараться, он следует формальным стандартам. Если появится Дай-Хард, то он наверняка даст линк на пагу, где объяснено, почему именно так: 64 бита ещё до АМД с интелом были ;)

Pi ★★★★★
()
Ответ на: комментарий от fghj

> и как протеворечит то что 64 бита были и до амд моим словам?

Ну например, на Alpha (и Linux, и Tru64), вроде как, всегда было sizeof(int)==sizeof(long)==sizeof(void*) == 8. В отличие от, скажем, sparc-64 или ia64.

Т.е. предполодение, что sizeof(int) == 4 всегда было неверным с т.з. переносимости.

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (26.03.2006 17:04:11):

>Ну например, на Alpha (и Linux, и Tru64), вроде как, всегда было sizeof(int)==sizeof(long)==sizeof(void*) == 8. В отличие от, скажем, sparc-64 или ia64.

Нет. как раз Дековцы и были главными энтузиастами LP64, см. мою ссылку постом выше.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> Нет. как раз Дековцы и были главными энтузиастами LP64, см. мою ссылку постом выше.

Эээ. Извиняюсь. Но я точно помню, что кто-то из более-менее распространенных 64-битных униксов - 8/8/8...

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (27.03.2006 1:13:15):

> ...точно помню, что кто-то из более-менее распространенных 64-битных униксов - 8/8/8...

Не знаю ни одного.

Но многие компиляторы имеют соответствующую опцию, так что речь идет лишь о дефолтном значении, принятом в системе. Конкретную программу обычно можно скомпилить и в ILP64

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