INFO: sizeof() Function Returns unsigned Instead of intLast reviewed: September 4, 1997Article ID: Q60332 |
The information in this article applies to:
SUMMARYTo comply with new ANSI specifications, the sizeof() operator in Microsoft C versions 6.0 and later and QuickC versions 2.5 and later returns an unsigned integer. In C version 5.1 and QuickC version 2.0, this function returns a signed int.
MORE INFORMATIONThe change to an unsigned return value can cause problems in code that uses the idiom "-sizeof(type)." The following code example attempts to position the file pointer one record from the end of a file. The method the code demonstrates works with C version 5.1, but fails with C version 6.0 and later.
fseek(file, (long)(-sizeof(record)), SEEK_END);This fseek call positions the file pointer far beyond the end of the file because the compiler does not sign extend the generated value. Because the unary minus (-) operator does not change the "signedness" of a variable and the sizeof() operator returns an unsigned int, the compiler performs a zero extension to convert the unsigned int to a long. In other words, if the record variable was of type char, the following code returns the long value -1 when compiled with C 5.1 and 32,767 when compiled with C 6.0:
(long)(-sizeof(record))One method to work around this problem involves casting the result of the sizeof operator to a signed int before negating the value and casting it to a long. For example:
(long)-(int)sizeof(record) Keywords : CLngIss kbfasttip Version : MS-DOS:6.0,6.00a,6.00ax,7.0; OS/2:6.0,6.00a,7.0; WINDOWS:1.0,1.5; WINDOWS NT:1.0,2.0,4.0,5.0 Platform : MS-DOS NT OS/2 WINDOWS Issue type : kbinfo |
================================================================================
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |