Why does this seek on BIGINT col have extra constant scan, compute scalar, and nested loops operators?
SELECT thing, 
       sql_variant_property(thing,'basetype') AS basetype,
       sql_variant_property(thing,'precision') AS precision, 
       sql_variant_property(thing,'scale') AS scale
FROM (VALUES (2147483648)) V(thing)


Shows you that the literal 2147483648 is interpreted as numeric(10,0). This behaviour pre-dates the introduction of the bigint in SQL Server (2000).

There is no syntax to indicate that a literal should be treated as bigint - adding an explicit CAST is the best solution. The article Dynamic Seeks and Hidden Implicit Conversions discusses the rest of the apparatus in the plan.

The plan itself shows that the nested loops has a seek predicate on

Seek Keys[1]: Start: [tempdb].[dbo].[Table1].col1 &gt; Scalar Operator([Expr1005]), 
                End: [tempdb].[dbo].[Table1].col1 &lt; Scalar Operator([Expr1006])


You can use an extended events  session on query_trace_column_values to see that these are as follows.



The XML in the plan also shows this

  &lt;DefinedValue&gt;
    &lt;ValueVector&gt;
      &lt;ColumnReference Column="Expr1005" /&gt;
      &lt;ColumnReference Column="Expr1006" /&gt;
      &lt;ColumnReference Column="Expr1004" /&gt;
    &lt;/ValueVector&gt;
    &lt;ScalarOperator ScalarString="GetRangeWithMismatchedTypes((2147483648.),NULL,(6))"&gt;
      &lt;Intrinsic FunctionName="GetRangeWithMismatchedTypes"&gt;
        &lt;ScalarOperator&gt;
          &lt;Const ConstValue="(2147483648.)" /&gt;
        &lt;/ScalarOperator&gt;
        &lt;ScalarOperator&gt;
          &lt;Const ConstValue="NULL" /&gt;
        &lt;/ScalarOperator&gt;
        &lt;ScalarOperator&gt;
          &lt;Const ConstValue="(6)" /&gt;
        &lt;/ScalarOperator&gt;
      &lt;/Intrinsic&gt;
    &lt;/ScalarOperator&gt;
  &lt;/DefinedValue&gt;


This does not mean that it is literally doing a comparison &lt; null rather 


  The range boundary expressions use NULL to represent 'unbounded' at either end. (Source)


So the net effect is that your query predicate of b.col1 &gt; CAST(2147483648 AS NUMERIC(10, 0)) still ends up with a seek against b.col1 &gt; CAST(2147483648 AS BIGINT)


  Does it affect bound parameters to prepared statements (from jtds JDBC) as well?


I haven't used jtds JDBC but I presume it allows you to define parameter datatypes? If so just make sure the parameters are the correct datatype that match the column (bigint) so there's no need for SQL Server to deal with mismatched datatypes.