FIX: ISHFT and ISHL Always Assume 4-Byte IntegersLast reviewed: September 18, 1997Article ID: Q111234 |
1.00 1.0a | 1.00
MS-DOS | WINDOWS NTkbtool kbfixlist The information in this article applies to:
SYMPTOMSThe 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.
CAUSEThe 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.
RESOLUTIONConvert 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.
STATUSMicrosoft 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 INFORMATIONThe following sample illustrates the problem:
Sample Code #1c 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 OutputBefore shift 85 FF85 After shift E1 FFE1The following code illustrates the article's resolution:
Sample Code #2c 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 OutputBefore shift 85 FF85 After shift 21 3FE1 |
Additional reference words: 1.00
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |