[Info-vax] problem with 64-bit pointers in C
Jan-Erik Soderholm
jan-erik.soderholm at telia.com
Wed Jan 31 09:15:35 EST 2018
Den 2018-01-31 kl. 13:40, skrev Joukj:
> John Reagan wrote:
>> The largest possible variable is 32-bits big even with 64-bit pointers.
>>
>> You can only subtract pointers that point inside the same variable.
>> Therefore they can never be more than 32-bits apart.
>
> So this will not bite me in the application : Although both pointer are
> 64-bit the difference result should be 32-bit.
> But still you always get the warning.....
>
>>
>> That's why ptrdiff_t is always 32. The type is built into the frontend
>> and can't easily be tweaked by header changes.
>>
>> You notice that size_t is also 32 even with 64-bit pointers.
>>
>> Looking back, better choices could have been made. Going forward, I'd
>> like to have a real LP64 mode with 'long' being 64 to match compilers
>> like clang.
>>
>> For now, typecast one of them to __int64 at the subtract.
> When casting one of them I get a a compiler error
> printf( "%lld\n" , (__int64)buffer - entry_start );
> ......................^
> %CC-E-NOSUBTRACT, In this statement, "entry_start" cannot be subtracted
> from "(6
> 4 bit int)buffer".
> at line number 13 in file $DISK6:[JOUKJ.test]test.c;86
>
> Type casting both is just the same as I did in the last line of the test
> and gives you sizeof(int)*<expected result>
>
This "works" (with a warning):
printf( "%d %d %d\n" , sizeof( entry_start ) ,
sizeof( (__int64)(entry_start - buffer) ) ,
sizeof( buffer ) );
It typecasts the *result* of the subtraction, not the individual
variables. Now, it can still not be a values larger than 32 bits,
I guess, even if it is later typecasted to 64 bits...)
>
> The reason for asking this question is that I tried to compile the pnglib
> package with 64 bit pointers. It compiled with some warnings and the
> self-test failed. So I'm trying to reduce the compile warnings first.
>
>
> regards
> Jouk
More information about the Info-vax
mailing list