How to do this in gfortran

Mark Hounschell markh@compro.net
Mon Jan 28 16:08:00 GMT 2013


On 01/28/2013 10:14 AM, Tim Prince wrote:
> On 01/28/2013 09:02 AM, Mark Hounschell wrote:
>> I am porting some very old code. I have many things like below in this
>> code
>>
>>
>>        program test
>>        implicit none
>>
>>        integer*1 ivalx1
>>        integer*2 ivalx2
>>        integer*4 ivalx4
>>
>>        parameter (ivalx1 = x'80')
>>        parameter (ivalx2 = x'8000')
>>        parameter (ivalx4 = x'80000000')
>>
>> The compiler fails with:
>>
>> f77 test.f
>> test.f:8.26:
>>
>>        parameter (ivalx1 = x'80')
>>                           1
>> Error: Arithmetic overflow converting INTEGER(8) to INTEGER(1) at (1).
>> This check can be disabled with the option -fno-range-check
>> test.f:9.26:
>>
>>        parameter (ivalx2 = x'8000')
>>                           1
>> Error: Arithmetic overflow converting INTEGER(8) to INTEGER(2) at (1).
>> This check can be disabled with the option -fno-range-check
>> test.f:10.26:
>>
>>        parameter (ivalx4 = x'80000000')
>>                           1
>> Error: Arithmetic overflow converting INTEGER(8) to INTEGER(4) at (1).
>> This check can be disabled with the option -fno-range-check
>>
>> I don't want to use the -fno-range-check option because I want to know
>> about the real ones. I don't understand why gfortran has issues with
>> this. They are certainly valid values for the the types specified. I
>> have been, just setting the values in the code section using the
>> 'transfer' instrinsic but now I'm finding these in include files and I
>> would have to change every source file that used the particular
>> include file. I'm sure there is an easy solution. Could someone
>> enlighten me please.
>>
>> Thanks and Regards
>> Mark
> Perhaps you could arrange to make the constants come out as x'80'_1,
> x'8000'_2, x'80000000'_4, or
> -1_1, -1_2, -1_4.  The values you set aren't valid positive integer
> values in the smaller type.
>

Why must it be a valid "positive integer"? How/why does the compiler 
even know/care whether I am going to use this data for an arithmetic 
operation or not. Even if I was, it should be up to me to be able to set 
the sign bit myself. x'80' is a valid negative integer*1 etc...

Regards
Mark



More information about the Gcc-help mailing list