En news:46fa8918$0$27384$ba4acef3@[EMAIL PROTECTED]
jacob navia va escriure:
> John Willett wrote:
>> Is there a way to explicitly specify a short-integer constant in
>> LCC-WIN32? I'm revising old 16-bit code written for Windows 3.1, and
>> I'm encountering a lot of expressions like "filerec.timelow &
>> 0x7C00u". "Filerec.timelow" was originally declared as "int" but
>> must now be changed to "short" because the structure is read from a
>> pre-existing binary file. Obviously, it would be nice if the
>> constant, "0x7C00u", were also a "short" (although it appears to run
>> correctly as is), but I don't see any suffix (like "us", for
>> example) in the do***entation.
>>
>>
> No, there isn't any way to do that, maybe because the
> standard specifies that AND operations between two
> shorts are promoted to ints, then the results are
> converted to whatever needs to be done.
That is not entirelly correct.
In the 32-bit world, Jacob is correct, both terms are converted to signed
int. However, in the 16-bit world, in an operation between a signed short
variable and a unsigned int constant, arguments are promoted to the
unsigned
type; this means two im****tant variations: the variable is converted from
signed to unsigned (should not be a problem), and the result is unsigned,
not signed (THIS, in turn, could affect the rest of the computations.)
Of course, if "Filerec.timelow" were originally declared as "unsigned
int",
then transformed to "unsigned short", it would probably have been better
and
clearer in the first place...
> Mostly this doesn't affect the results.
This was the position of the C committee, which chose these rules to
achieve
the principle of lesser surprise (particularly when ****ting form 16-bit to
32-bit.)
Antoine


|