/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
signed unsigned
Fra : Troels


Dato : 23-11-10 02:01

Hej,

Nu blev jeg igen snydt af min compiler

signed int s16Value = -1;
unsigned int u16Value = 16;

signed int result1 = s16Value - u16Value;

Værdien giver -17 som forventet

Men:
#define MIN(x,y) ((x) < (y)) ? (x) : (y)
signed int result2 = MIN((s16Value - u16Value) , 0);
giver 0 !

Hvis man skriver den ud bliver det til:
   if ((s16Value - u16Value) < 0)
   {
......
hvilket aldrig bliver sandt , fordi regnestykket bliver lavet
'unsigned'

Er det hamret ud i granit at c altid vil gøre sådan, eller er det
implementationsspecifikt ?
Har prøvet på IAR og MSVC++2010


/Troels



 
 
Arne Vajhøj (24-11-2010)
Kommentar
Fra : Arne Vajhøj


Dato : 24-11-10 02:49

On 23-11-2010 04:01, Troels wrote:
> Hej,
>
> Nu blev jeg igen snydt af min compiler
>
> signed int s16Value = -1;
> unsigned int u16Value = 16;
>
> signed int result1 = s16Value - u16Value;
>
> Værdien giver -17 som forventet
>
> Men:
> #define MIN(x,y) ((x)< (y)) ? (x) : (y)
> signed int result2 = MIN((s16Value - u16Value) , 0);
> giver 0 !
>
> Hvis man skriver den ud bliver det til:
>    if ((s16Value - u16Value)< 0)
>    {
> ......
> hvilket aldrig bliver sandt , fordi regnestykket bliver lavet
> 'unsigned'
>
> Er det hamret ud i granit at c altid vil gøre sådan, eller er det
> implementationsspecifikt ?
> Har prøvet på IAR og MSVC++2010

C99 siger:

Otherwise, if the operand that has unsigned integer type has rank greater or
equal to the rank of the type of the other operand, then the operand with
signed integer type is converted to the type of the operand with unsigned
integer type.

Og hvis jeg læser den rigtigt så garanterer den det du
observerer.

C89 er mere direkte:

Otherwise, if either operand has type unsigned int, the other
operand is converted to unsigned int.

Arne

Troels (29-11-2010)
Kommentar
Fra : Troels


Dato : 29-11-10 07:04

>
> Og hvis jeg læser den rigtigt så garanterer den det du
> observerer.
>

Takker,
+ - * / er lækkert syntax sukker, men djævlen ligger, som altid, i
detaljen !
(man skal tænke lidt over promotion også, osv)

/T

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste