🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.std.c
Article #3530

Re: Integral promotion.

#3530
From: Richard A. O'Keefe
Date: Thu, 15 Feb 1996 14:49
48 lines
2610 bytes
Rune Huseby <rune.huseby@gpi.telemax.no> writes:
>short test(short x1, short x2)
>{
>  short result;
>  result = x1 + x2;  /* Warning:  '=' : conversion from 'int '                                 
>                         to 'short ', possible loss of data */
>  return result;
>}

Your compiler is right.  "Integral promotion" means that before anything
else happens to them in an arithmetic expression, signed char and short
promote to int, and unsigned char and unsigned short promote to unsigned int.
Your compiler has to be able to implement arithmetic on
	signed int		signed long
	unsigned int		unsigned long
but not on any other integral types.  Note in particular that in a system
where INT_MAX > SHRT_MAX loss of data really _is_ possible:

	short x1 = SHRT_MAX;
	short x2 = SHRT_MAX;
	short result = x1 + x2;	/* OVERFLOW! */

On a 16-bit sloppy system, the chances are pretty good that you'd get
	result < 0
but on a 32-bit system, sloppy or not, this example must yield
	result > 0.
And remember, on a MIPS, Alpha, SPARC, 88k, &c there _is_ no 16-bit add
instruction; it _has_ to be done in 32-bit mode.

Yes, there are C compilers that generate code that raises an exception if
a signed integer overflow occurs.  I've used one.  It's *extremely* useful
because it's almost always a mistake.  If you really want wraparound, you
can use unsigned arithmetic.

>The reason I ask is that I am writing code that should be 
>portable from a 16-bits environment (where short and int are the 
>same size) to a 32-bits environment. (My 16-bits compiler does 
>not complain about the code).

Well, there's no way to get exactly the same set of warnings on every
system; a compiler can legitimately complain about the colour of your
eyes if it wants to, as long as it correctly translates the code.

It is really really worth investing in a 'lint' checker.  If you're using
a DOS system, I've heard good things about Gimpel's lint.
-- 
Election time; but how to get Labour _out_ without letting Liberal _in_?
Richard A. O'Keefe; http://www.cs.rmit.edu.au/~ok; RMIT Comp.Sci.
Technical Details
Message-ID: <4fvh6f$e29@solutions.solon.com>
Path: arc1-ca.pugleaf.net!solon.com!not-for-mail
References: <4fstj7$2l6@solutions.solon.com>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!solon.com!not-for-mail
From: ok@cs.rmit.edu.au (Richard A. O'Keefe)
Newsgroups: comp.std.c,comp.lang.c.moderated
Subject: Re: Integral promotion.
Date: 15 Feb 1996 08:49:50 -0600
Organization: Comp Sci, RMIT, Melbourne, Australia
Sender: clc@solutions.solon.com
Approved: clc@solutions.solon.com
Message-ID: <4fvh6f$e29@solutions.solon.com>
References: <4fstj7$2l6@solutions.solon.com>
NNTP-Posting-Host: solutions.solon.com
X-Newsreader: NN version 6.5.0 #0 (NOV)