|
| 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
| |
|
|