J'ai fait le test (j'ai Fedora x86_64) :
#include <iostream>
int main(void)
{
int unsigned a = 5000000000;
std::cout << a << std::endl;
return 0;
}
J'obtiens :
$ g++ -m64 test.cc -o test && ./test
test.cc: In function 'int main()':
test.cc:5: attention : grand entier implicitement tronqué pour un type non signé
705032704
Là même chose avec
long affiche bien 5000000000.
Par contre si j'utilise toujours
long mais que je compile cette fois avec le paramètre -m32, je me fait jeter par le compilateur :
$ g++ -m32 test.cc -o test && ./test
Dans le fichier inclus à partir de /usr/include/features.h:359,
à partir de /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/x86_64-redhat-linux/32/bits/os_defines.h:44,
à partir de /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/x86_64-redhat-linux/32/bits/c++config.h:40,
à partir de /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/iostream:44,
à partir de test.cc:1:
/usr/include/gnu/stubs.h:7:27: erreur: gnu/stubs-32.h : Aucun fichier ou dossier de ce type
test.cc:5: erreur: integer constant is too large for 'long' type
test.cc: In function 'int main()':
test.cc:5: attention : grand entier implicitement tronqué pour un type non signé
Ce qui vérifie bien ce qui est écrit dans mon bouquin.
PS: Ah Remi m'a doublé avec une technique bien plus élégante 🙂