是的,@int1 > 127 的时候越界了.解决方法还在验证.我也曾经用bigint实验过,但是效果不理想啊. 用bigint转换后,我还需要执行 ^ (XOR)操作.发现T-SQL写算法太复杂了. 原来的C程序中使用了结构体, union { int n, char c[4] }abc;修改了c[i]的值后,n的值会自动改变,但是在T-SQL中实现起来就麻烦了.
--逻辑左移函数 --@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 */
@int1 int,
@int2 decimal(18,0)
Set @int1 = 0x01
Set @int2 = @int1 * 256 * 256 * 256
Select @int2, Cast(@int2 as binary(4))
应该是 0x01000000吧?其他弟兄的方法正在实验中
用bigint转换后,我还需要执行 ^ (XOR)操作.发现T-SQL写算法太复杂了.
原来的C程序中使用了结构体,
union
{
int n,
char c[4]
}abc;修改了c[i]的值后,n的值会自动改变,但是在T-SQL中实现起来就麻烦了.
--@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
*/