Q:

Why is the first Integer 2147483648? 

I'm trying to learn Ada, and this surprised me. 
The output of this program:
with Ada. Text_IO; use Ada. Text_IO;
with Ada. Integer_Text_IO; use Ada. Integer_Text_IO;

procedure Main is

function lstrip(S: String) return String is
begin
    return S(S'First+1 .. S'Last);
end;

function "&"(Left: String; Right: Integer) return String is
begin
    return Left & lstrip(Integer'Image(Right));
end "&";

function "&"(Left: Integer; Right: String) return String is
begin
    return lstrip(Integer'Image(Left)) & Right;
end "&";

begin
   Put_Line("Integer'First=" & Integer'First);
   Put_Line("Integer'Last=" & Integer'Last);
end Main;

Is this:
Integer'First=2147483648
Integer'Last=2147483647

But why is Integer'First larger than Integer'Last?  I would expect it to be a negative number. 

A:

Why is the first Integer 2147483648? 

It isn't. 
Your lstrip function removes the first character of its argument. 
Integer'Image(Integer'First) returns "-2147483648".  Your lstrip function changes that to "2147483648". 
It looks like you're trying to remove the leading space added by Integer'Image (I've always found that annoying myself).  But Integer'Image adds that leading space only for non-negative numbers.  Try this version of lstrip:
function lstrip(S: String) return String is
begin
    if S(S'First) = ' ' then
        return S(S'First+1 .. S'Last);
    else
        return S;
    end if;
end;

Note that -2147483648 is a very common value for Integer'First, but the standard only guarantees that it's no greater than -32767.