Amigos tengo esta prueba que compila aunque uso sscanf y no creo que sea lo mejor y ademas sscanf siempre me retorna 0 en la variable de 64 bits.
Código PHP:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <limits>
#include <stdio.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool IsOverflow (AnsiString valor)
{
bool overflow=false;
AnsiString valorLimite = std::numeric_limits<unsigned long long>::max();
if(valorLimite.Length() == valor.Length()){
for (int i=1; i <=valor.Length(); i++)
{
if(valorLimite[i] > valor[i]){
break;
}else if (valorLimite [i] < valor[i]){
overflow=true;
break;
}
}
}else if(valorLimite.Length() > valor.Length()){
overflow= false;
}else{
overflow=true;
}
return overflow;
}
//---------------------------------------------------------------------------
bool dividirHex(AnsiString dividendo, AnsiString divisor, AnsiString *cociente, AnsiString *resto)
{
unsigned __int64 auxDividendo, auxDivisor, auxCociente=0, auxResto=0;
bool salir=false;
bool retval=false;
int largoDividendo, largoDivisor, largoPorcion, pos;
largoDivisor=divisor.Length();
if (!IsOverflow (divisor)){
*cociente="";
*resto="";
sscanf(AnsiString("0x" + divisor).c_str(), "%I64u", &auxDivisor);
do {
largoDividendo=dividendo.Length ();
largoPorcion=largoDivisor;
if(largoDividendo >= largoDivisor){
sscanf(AnsiString("0x" + dividendo.SubString(1,largoPorcion)).c_str(), "%I64u", &auxDividendo);
if(auxDivisor > auxDividendo){
if(largoDividendo > largoDivisor){
largoPorcion++;
}else{
break;
}
}
if(IsOverflow(dividendo.SubString(1,largoPorcion))){
salir=true;
retval=false;
}else {
sscanf(AnsiString("0x" + dividendo.SubString(1,largoPorcion)).c_str(), "%I64u", &auxDividendo);
auxResto=auxDividendo % auxDivisor;
dividendo=dividendo.SubString(largoPorcion,largoDividendo);
auxCociente=auxDividendo / auxDivisor;
*cociente=*cociente + AnsiString (auxCociente);
*resto=AnsiString(auxResto);
if (auxResto > 0)
dividendo= *resto + dividendo.SubString(largoPorcion,largoDividendo);
else
dividendo= dividendo.SubString(largoPorcion,largoDividendo);
retval=true;
}
}else {
salir=true;
*resto=dividendo;
*cociente=*cociente + "0";
retval=true;
}
}while(!salir);
}
return retval;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Dividendo="FFFFFF",Divisor="FF",Cociente,Resto;
dividirHex(Dividendo, Divisor, &Cociente, &Resto);
}
//---------------------------------------------------------------------------
A ver si me podeis ayudar.