带有十六进制整数常数和十进制整数的负整数异或会产生不同的结果吗?

我试图创建一个表“ MyTable”,并添加一个具有小整数类型的字段“ field1”。

然后,我向field1添加一个负数-12289。

然后,我执行以下SQL查询:

select field1 ^ 0xcfff from MyTable

结果为零。

但是,如果我用十进制整数常量替换十六进制整数常量,如下所示:

select field1 ^ 53247 from MyTable

其结果是-65536。

为什么?

The only clue is on https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql?view=sql-server-ver15

大于2,147,483,647的整数常量将转换为十进制数据类型,而不是bigint数据类型。

但是0xcfff和53247都比2,147,483,647小得多。为什么它们会产生差异结果?

评论
  • 静静的思念
    静静的思念 回复

    这是因为数据的长度。 执行按位运算符时,应使用相同的字节长度:

    1100 1111 1111 1111 <--  -12289 as smallint (word)
    1100 1111 1111 1111 <--  CFFF (-12289) (word)
    0000 0000 0000 0000 <--  XOR result = 0 (word)
    
    1111 1111 1111 1111 1100 1111 1111 1111 <--  -12289 as int (double word)
    0000 0000 0000 0000 1100 1111 1111 1111 <--  53247 (0000CFFF) (double word)
    1111 1111 1111 1111 0000 0000 0000 0000 <--  XOR result = -65536 (double word)
    

    您可以尝试更改长度:

    select cast(-12289 as int) ^ 0x00cfff, -12289 ^ cast(0x00cfff as int)