The right-handed slugger became a free agent when the Houston Astros declined to offer him a contract in December.
The Brewers were in need of a first baseman after trading Adam Lind to Seattle for prospects last month. The deal includes $500,000 in performance bonuses based on plate appearances: $100,000 each for 350, 400 and 450, and $200,000 for 500.
Carter, who hit .199 with 24 homers and 64 RBIs in 2015, made $4,175,000 in 2015 in his first year of arbitration. Houston let him go rather than pay the likely more than $5 million salary he would have commanded in arbitration this year.
The move reunites Carter with Milwaukee general manager David Stearns, who worked as Houston's assistant general manager until this summer.
"We are pleased to be able to add Chris to our organization," Stearns said in a statement. "Over the past three seasons, Chris has proven to be one of the most consistent power threats in the game. We believe that his skills and experiences will complement our team well and provide additional production to our lineup."
The 29-year-old Carter had a tough time in 2015. He was benched in the summer before working his way back into the lineup and hitting .344 in September to help the Astros earn the second AL wild-card spot, their first postseason berth since 2005. He was also solid for the Astros in the ALDS before they were eliminated by the Royals, hitting .294 with a double, a homer and an RBI.
Carter started at first base in each of Houston's six playoff games and was a triple shy of the cycle in Game 3 of the ALDS when he finished 3 for 3 with one RBI and two runs scored.
He's looking forward to the new opportunity.
"It's a great chance for me to get every day at-bats and bounce back after last year," Carter told The Associated Press.
Carter tied for second in the majors with a career-high 37 homers in 2014 and had 90 homers in just three seasons with the Astros after a trade from Oakland. He led the team in both homers and RBIs in 2013 when he had 29 homers and 82 RBIs and in 2014 when he had 88 RBIs to go with his 37 homers. He led the majors in 2014 when he hit a home run once in every 13.7 at-bats.
He is a career .217 hitter with 109 homers and 280 RBIs.
Carter spent 120 games at designated hitter in 2014, but returned to the field last season when 105 of his 112 games came at first base. He's also played 79 games in the outfield in his career, but did not play there once last season. This will be his first time playing in the National League, but he believes his time at first base last year showed that he could play every day at that position.
The 6-foot-4, 250-pound Carter was a 15th-round pick of the Chicago White Sox in 2005. He made his major league debut in 2010 with Oakland and played in parts of three seasons for the Athletics before the trade to Houston in 2013.
Milwaukee's backup first baseman last season was Jason Rogers, but he was traded to the Pirates on Dec. 17, leaving the Brewers with an even bigger need at first base.
The Brewers designated catcher Josmil Pinto for assignment to make room for Carter on the 40-man roster.