Насчет типов и их размеров, чтобы не было недопониманий зачем это нужно... Простой пример:
$ cat test.cpp
#include <iostream>
using namespace std;
int main() {
cout << sizeof(short) << endl;
cout << sizeof(int) << endl;
cout << sizeof(long) << endl;
cout << sizeof(long long) << endl;
return 0;
}
$
Собираем разными компиляторами:
$ i686-w64-mingw32-g++ -o test32.exe test.cpp
$ x86_64-w64-mingw32-g++ -o test32.exe test.cpp
$ g++ -o test64 -m64 test.cpp
$ g++ -o test32 -m32 test.cpp
$
$ ls
test32 test64.exe test32.exe test.cpp test64
$
Полюбуемся, что же оно выводит.
$ ./test32
2
4
4
8
$ ./test64
2
4
8
8
D:\Test>test32.exe
2
4
4
8
D:\Test>test64.exe
2
4
4
8
D:\Test>
4-байтный long на Win64, кто бы мог подумать...
Хотя, стандарт впрочем и говорит что long должен быть больше либо равен по длине int, ничего не говоря о том что он обязан быть больше.
В случае целочисленного переполнения разногласия между 64-разрядными и 32-разрядными клиентами могут быть довольно интересными, если не использовать для критичных структур типы с гарантированным размером.
P.S. Кстати, при сборке MSVC64 размер long таки 8 байт... Надо будет Intel C++ попробовать.