Morrison had told manager Nigel Adkins he wanted speak to Cardiff despite signing a contract extension in 2013.
The 23-year-old's signing comes after the Bluebirds sold Steven Caulker to QPR and after defender Ben Turner sustained an ankle injury in July.
Cardiff also completed the signing of winger Anthony Pilkington from Norwich City for £1m on Friday.
City manager Ole Gunnar Solskjaer is trying to buy another centre-back to increase his options, with defender Juan Cala sidelined through suspension.
The Norwegian manager also refused to rule out a deal for former Bluebirds defender Danny Gabbidon, who has 49 caps for Wales.
Morrison joined the Royals from Swindon in 2011 and spent two spells on loan at Huddersfield Town before establishing himself in the Reading first-team.
He started in both of Reading's games this season, including scoring in a 2-2 draw with Wigan.
Solskjaer hopes to have Morrison available for Cardiff's fixture against Huddersfield Town on Saturday, who are without a manager following their 4-0 defeat by AFC Bournemouth on the opening weekend.
Cardiff City have signed Reading defender Sean Morrison after he completed a medical on Thursday.