用 bigint  类型 用 int 超出长度

解决方案 »

  1.   

    int从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。当@int1 > 127 时,越界溢出了!
      

  2.   

    Declare 
    @int1 int,
    @int2 decimal(18,0)
    Set @int1 = 0x01
    Set @int2 = @int1 * 256 * 256 * 256
    Select @int2, Cast(@int2 as binary(4))
      

  3.   

    zjcxc(邹建) : @int2 Decimal(18,0) 和 Decimal(20, 0)的结果好像不同啊.而且用18得出来得结果是:16777216   0x12000001
    应该是 0x01000000吧?其他弟兄的方法正在实验中
      

  4.   

    是的,@int1 > 127 的时候越界了.解决方法还在验证.我也曾经用bigint实验过,但是效果不理想啊.
    用bigint转换后,我还需要执行 ^ (XOR)操作.发现T-SQL写算法太复杂了.
    原来的C程序中使用了结构体,
    union
    {
      int     n,
      char    c[4]
    }abc;修改了c[i]的值后,n的值会自动改变,但是在T-SQL中实现起来就麻烦了.
      

  5.   

    --逻辑左移函数
    --@n为左移的位数 取值 [0,32]
    create function dbo.fShl( @int int, @n tinyint ) 
    returns int
    begin
    if @n < 0 or @n > 32 return 0 ;
    declare @bigint binary(8)
    set @bigint = @int 
    while @n > 0
    begin
    set @bigint = @bigint * cast(2 as bigint)
    set @n = @n - 1
    end
    return @bigint & -1end
    go--测试
    declare @testint int
    set @testint = 1234123123
    select cast( 1234123123 as binary(4) ) '移位前'
    select cast( dbo.fShl(1234123123,8) as binary(4) ) '逻辑左移8位后'/*
    结果:
    移位前        
    ---------- 
    0x498F3973逻辑左移8位后    
    ---------- 
    0x8F397300
    */