Microsoft KB Archive/111234

= FIX: ISHFT and ISHL Always Assume 4-Byte Integers =

Article ID: 111234

Article Last Modified on 10/17/2003

-

APPLIES TO


 * Microsoft FORTRAN PowerStation 1.0 Standard Edition
 * Microsoft Fortran PowerStation 1.0a for MS-DOS
 * Microsoft FORTRAN PowerStation 32

-



This article was previously published under Q111234



SYMPTOMS
The ISHL and ISHFT intrinsic functions may return incorrect results when shifting INTEGER*1 or INTEGER*2 variables. The incorrect results occur only when right-shifting negative values.



CAUSE
The compiler converts the value to be shifted to a 4-byte value. For 1- and 2-byte negative integers, the higher order bits are filled with 1s, which can be incorrectly shifted into the low order bytes.



RESOLUTION
Convert the bit pattern of the negative INTEGER*1 or INTEGER*2 value to an unsigned INTEGER*4 value. This is done by adding 256 to a negative INTEGER*1 value or by adding 65536 to a negative INTEGER*2 value. Then shift the resulting INTEGER*4 value.



STATUS
Microsoft has confirmed this to be a problem in FORTRAN PowerStation 32 for Windows NT version 1.0 and MS-DOS version 1.0 and 1.0a. This problem was fixed in FORTRAN PowerStation 32, version 4.0.



MORE INFORMATION
The following sample illustrates the problem:

Sample Code #1
c Compile options needed: none c integer*2 i2     integer*1 i1      i1 = -123 i2 = i1     write(*,'( Before shift ,Z2,2x,z4)') i1, i2      write(*,'( After shift  ,Z2,2x,z4)') ishl(i1,-2), ishl(i2,-2) end

Output
Before shift 85 FF85

After shift E1 FFE1

The following code illustrates the article's resolution:

Sample Code #2
c Compile options needed: none c integer*4 j,k integer*2 i2     integer*1 i1      i1 = -123 i2 = i1     j = 256 + i1      k = 65536 + i2      write(*,'( Before shift ,Z2,2x,z4)') i1, i2      write(*,'( After shift  ,Z2,2x,z4)') ishl(j,-2), ishl(k,-2) end

Output
Before shift 85 FF85

After shift 21 3FE1

Additional query words: 1.00

Keywords: kbbug kbfix kblangfortran KB111234

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.