lmm333吧 关注:4贴子:109
  • 3回复贴,共1

【工具函数】__int64和string的转化

只看楼主收藏回复

先转载再说
string Int64AsString( __int64 value )
{
if ( value == 0 )
{
return string(0);
}
bool isNegative = false;
string result;
if ( value<0 )
{
result += string("-");
value = -value;
isNegative = true;
}
int flag = 10;
int int64BitMax = 20;
int bitRecord = 1;
for ( int bit=1; bit<=int64BitMax; bit++ )
{
__int64 flagValue = power( flag, bit );
//找出是第几位数
if ( value/flagValue == 0 )
{
bitRecord = bit;
break;
}
}
//从最高位开始
for ( bit=bitRecord; bit>=1; bit-- )
{
__int64 flagValue = power( flag, bit );
int bitValue = (value - value/flagValue*flagValue)/(flagValue/10);
result += IntAsString(bitValue);
}
return result;
}
__int64 StringAsInt64( const string & value )
{
string valueCopy(value);
__int64 result = 0;
int flag = 10;
bool isNegative = false;
if ( value[0] == '-' )
{
//负数
valueCopy.erase( valueCopy.begin() );
isNegative = true;
}
if ( isNegative )
{
//太大
if ( value.size()>=20 )
{
//出错
return -1;
}
}
else
{
//太大
if ( value.size()>=19 )
{
//出错
return -1;
}
}
for ( int bit=0; bit<valueCopy.size(); bit++ )
{
__int64 bitValue = power( flag, valueCopy.size()-bit-1 );
//0的asic码是48,字符'1',(int)'1'后,得到49,再减去48
result += bitValue*((int)valueCopy[bit]-48);
}
if ( isNegative )
{
result = -result;
}
return result;
}
//value的index次方(不处理负数)
__int64 power( int value, int index )
{
if ( index == 0 )
{
return 1;
}
//如果小于0或是超出了__int64的最大位数
if ( index<0 || index>=19 )
{
#ifdef _DEBUG
ASSERT(0);
#endif
return -1;
}
__int64 result = 1;
for ( int i=1; i<=index; i++ )
{
result *= value;
}
return result;
} 


IP属地:江苏1楼2010-07-10 10:12回复
    关于__int64的用法
    转载 关于__int64的用法收藏
    __int64是MS自创的, 要用64位int的话C中本来就自带:
    #include <stdio.h>
    #include <limits.h>
    int main()
    {
         long long a = LLONG_MAX;
         unsigned long long b = ULLONG_MAX;
         printf("%lld\n%llu", a, b);
    }
    参考资料:ANSI C99
    资料二:
    // MS Windows下的VC、BCB、MingW GCC等用:
    __int64 n;
    scanf("%I64u",&n);
    printf("%I64u\n", n);
    其中MingW GCC还支持用long long声明,但输入输出的格式串仍用I64开头。
    __int64关键字和I64标号确实是MS专有的。标准C用long long和%lld。所以在Unix、Linux、Cygwin下编程就应该用标准的用法了。
    


    IP属地:江苏2楼2010-07-10 13:26
    回复
      __int64 类型(VC中)与long long 型(gcc中,C99标准)(转)
      文章分类:C++编程
      int64 是有符号 64 位整数数据类型,也就是 C# 中的 long 和 SQL Server 中的 bigint,范围为 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807),存储空间占 8 字节。用于整数值可能超过 int 数据类型支持范围的情况。
      c#中:
      Int64 值类型表示值介于 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数。
      Int64 为比较此类型的实例、将实例的值转换为它的字符串表示形式以及将数字的字符串表示形式转换为此类型的实例提供了相应的方法。
      警告 在 32 位 Intel 计算机上分配 64 位值不是原子操作;即该操作不是线程安全的。这意味着,如果两个人同时将一个值分配给一个静态 Int64 字段,则该字段的最终值是无法预测的。
      有关格式规范代码如何控制值类型的字符串表示形式的信息,请参见格式化概述。此类型实现接口 IComparable、IFormattable 和 IConvertible。使用 Convert 类进行转换,而不是使用此类型的 IConvertible 显式接口成员实现。
      C语言INT64   (VC中)
      C代码
      __int64 是一个关键字,用_int64 来可以指定一个64位的整型变量    
      __int8 nSmall;       // 声明 8位 整数    
      __int16 nMedium;     // 声明 16位 整数    
      __int32 nLarge;      // 声明 32位 整数    
      __int64 nHuge;       // 声明 64位 整数   
      __int64 是一个关键字,用_int64 来可以指定一个64位的整型变量
      __int8 nSmall;       // 声明 8位 整数
      __int16 nMedium;     // 声明 16位 整数
      __int32 nLarge;      // 声明 32位 整数
      __int64 nHuge;       // 声明 64位 整数  
      long    long是C99标准的C语言内置类型。需要符合C99的编译器
      C代码
      g++ /gcc中   
        
      long long a;    
      printf("%lld",a);     
        
      mingw32 中   
        
      __int64 a;    
      printf("%I64d",a);    
      g++ /gcc中
      long long a;
      printf("%lld",a);  
      mingw32 中
      __int64 a;
      printf("%I64d",a);  
      


      IP属地:江苏3楼2010-07-10 13:27
      回复
        IP属地:江苏5楼2010-07-10 13:35
        回复