help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: conversion warning


From: BobR
Subject: Re: conversion warning
Date: Fri, 21 Sep 2007 03:17:06 GMT

Paul Pluzhnikov wrote in message...
> "BobR" writes:
>
> > Alexandru Mosoi wrote in message...
> >> supposing that I have the following lines:
> >>
> >> long long a = 12345678901234567890LL;
> >> int b = a;
> >>
> >> how can I make g++ (4.1.2) issue an warning because of loss of
> >> precision?
> >>
> >
> > Use -ansi -pedantic.
>
> int main()
> {
>     unsigned long long a = 12345678901234567890ULL;
>     int b = a;
>     return 0;
> }
>
> $ /usr/local/gcc-4.2.1/bin/g++ -ansi -pedantic t.c
> t.c:3:28: warning: use of C99 long long integer constant
> t.c: In function 'int main()':
> t.c:3: error: ISO C++ does not support 'long long'
>
> $ /usr/local/gcc-4.2.1/bin/gcc -ansi -pedantic t.c
> t.c: In function 'main':
> t.c:3: warning: ISO C90 does not support 'long long'
> t.c:3:28: warning: use of C99 long long integer constant
>
> Perhaps you should try your suggestions before suggesting them?

Using only -Wall (no -ansi or -pedantic):

    double c( 123.054);
    int d = c;
// [Warning] initialization to `int' from `double'
// [Warning] argument to `int' from `double'

But, type 'unsigned long long' is not a 'built-in' type (maybe next ISO),
so, the 'warning: use of C99 long long integer constant' is the only way I
know.
I always do the checks at runtime.

You could do:
    unsigned long long a = 12345678901234567890ULL;
    int b(0);
     if( b == a ){}
// [Warning] comparison between signed and unsigned integer expressions

Kind of silly. If you knew to put the 'if()' there, you'd know to do it
right.

     if( sizeof( b ) == 4 ){
          b = a & 0x7FFFFFFF;
          if( (unsigned long long)(b) != a ){ b = 0; }
          }

....or whatever.

You got anything?

--
Bob R
POVrookie




reply via email to

[Prev in Thread] Current Thread [Next in Thread]