Мое почтение всем. Нужно вывести 64битное число на любой платформе. Немного подробностей. Есть куски памяти по 8 байт. Их надо уметь показать пользователю как знаковое и беззнаковое в различных системах исчисления. При этом хочется поддержать как можно больше компиляторов (Win*/*nix). MS VS не поддерживает С99 (исходник написан на С, не на С++), значит надо придерживаться С89. С другой стороны я все равно использую типы с четкими размерами (uint8_t, uint32_t, etc), их поддержка притащена с файлом pstdint.h от Paul Hsieh. Вывод меньших (8/16/32) типов я сделал с помощью своей простенькой itoa, заточенной под мои нужды. Перед вызовом ф-ии я привожу операнд к размеру 32_t и указываю наличие знака: Код (Text): int itoa(uint32_t num, int is_signed, int radix) { int div; int dig; int res; res = 0; div = 1; if (is_signed) { if (num & 0x80000000) { di_copy_byte('-'); num = ~num; num++; } } while(num / div > radix) div *= radix; while(div) { dig = (num / div) % radix; if (dig > 10) dig += 'A' - 10; else dig += '0'; di_copy_byte(dig); res++; div /= radix; } return res; } 64битный тип до этого поддерживался структурой QWORD с двумя 32_t членами. Однако, писать itoa для структуры мне пока не хочется -- придется писать операции умножения и деления. Т.к. задача вывода довольно-таки промежуточная и, подозреваю, вообще не будет использоваться, не хочется разводить много кода вокруг нее. Теперь, собственно, вопрос: если я просто использую тип uint64_t, могут ли у меня возникнуть проблемы с кросс-платформенностью? Т.е. мне нужно, чтобы исходник компилировался и работал в MS VS как .с файл (в будущем, возможно, потребуется .cpp), и в *nix как .с файл. Могут ли возникнуть какие-нибудь проблемы? Насколько широкий охват компиляторов сейчас желателен? (Программа, может быть, будет OpenSource). Заранее благодарен.
gcc: typedef unsigned long long uint64; vc++: typedef unsigned __int64 uin64; uint64 i = (uint64)-1; char buff[64]; sprintf(buff, "%I64u", i);