Optimal data type for storing numbers in SQL Server
You can use row compression Row Compression Implementation that in designed to solve exactly this problem.
And you can also think about page compression that first applies row compression and then tries to achieve space savings using dictionary
Update: available also in Standard started with SQL Server 2016 SP1