Microsoft KB Archive/60332

= INFO: sizeof Function Returns unsigned Instead of int =

Article ID: 60332

Article Last Modified on 12/11/2003

-

APPLIES TO


 * Microsoft C Professional Development System 6.0a
 * Microsoft C Professional Development System 6.0a
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q60332





SUMMARY
To 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 INFORMATION
The change to an unsigned return value can cause problems in code that uses the idiom &quot;-sizeof(type).&quot; 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 &quot;signedness&quot; 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: kbinfo kblangc KB60332

-

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

© Microsoft Corporation. All rights reserved.