老唐(姜文飾)是壹個花心的風流才子,曾經參過軍,並且是戰鬥英雄。老梁(黃秋生飾)是他的鐵哥們和同事,也是壹個多才多藝的人,頗受女孩子青睞。他們同時喜歡上了後來嫁給老唐的唐妻(孔維飾),老梁追了他三年,都已經訂婚了,但最後老唐只用壹封信就打動了孔維,孔維嫁給了老唐,老梁很失落,借著婚禮大摸女人屁股,這時候是1958年。而在同壹時間,瘋媽(周韻飾)挺著大肚子懷孕快生了,她懷的是老唐的兒子(房祖名飾)。老唐生性風流,假借戰鬥英雄的光環,誘騙了他的愛戴者——瘋媽,並發生了關系,這時候老唐用的是假名:李不空。瘋媽其實也不傻,知道自己被騙,但也無奈所以幹脆叫他阿遼莎。老唐為了擺脫瘋媽,編造了自己戰亡的假消息,但是也還是騙不過瘋媽,所以她壹直說“我知道我知道”。老唐的遺物有壹包信,但不是寫給瘋媽的,還有三根女人的辮子。瘋媽的悲劇開始了,可以想象在那樣壹個年代,壹個未婚的媽媽帶著壹個私生子將如何生存。她也許想到了自殺,生下兒子後可能也是有意扔下了火車,但是偉大的母愛阻止了她,她叫停了火車,瘋狂地沿著鐵軌跑回去找回了她的兒子。她對著老唐婚禮的篝火晚會方向高喊:“阿遼莎,別害怕,火車在上面停下啦,天壹亮他就笑了。”
瘋媽帶著私生子小隊長(房祖名飾)在小警察李叔的帶路下,千裏迢迢來到了老唐的老家,生活了18年,期待有壹天能等到老唐的回來,但是壹個沒有名分的女人,在那個壓抑的年代,只能靠裝瘋賣傻來阻止別人的閑言碎語,或者是不肯接受現實而有意活在自己幻想的世界裏,總之瘋媽不應是真的瘋。她的生活可以想見非常淒苦。她每天爬上村頭的樹上了望,期待奇跡的發生。
1976年,奇跡真的發生了,壹天村裏接到電話:老唐被下放回來了。於是瘋媽不瘋了,就在老唐要回來的那壹天,她穿得整整齊齊,告訴小隊長,她再也不打他、也不上樹、也不刨坑了,讓他趕快去村口接人。老唐是回來了,但是並不是壹個人回來,還帶著他的妻子,於是瘋媽的悲慘生活到了盡頭——她跳河自殺了。老唐沒有見到這個苦等了他18年的女人。
老唐結婚後與妻子兩地分居,老唐與老梁壹起被分配到壹所大學當老師。老梁能彈壹手好吉他,深受少女們喜愛,追求者眾多,但是在這樣壹個壓抑的年代,他卻心如止水,因為他所深愛的人嫁給了老唐。但是在看壹場電影的時候,他卻被誤當作摸女人屁股的流氓,被眾人追打,摔斷了腿,尊嚴盡失。最後終於查清了真正的流氓,老梁洗脫了罪名的時候,他自殺了,之前沒自殺是因為不願在屈辱中死去。但也可能是他殺,他死於老唐和林大夫(陳沖飾)之手(影片中很多地方給這種猜測提供了依據),因為老梁無意中撞破了老唐和林大夫的奸情。其實老梁和唐妻也很可能有奸情,猜想源自那桿獵槍,獵槍本是老唐的,他應該是交給了自己的妻子保管,但卻到了老梁家裏,老唐當時說“好像在新疆見過這把槍”(老梁和唐妻的事很像馮夢龍“三言二拍”裏《珍珠衫》的故事), 這壹點也增加了老梁是被殺的可能。
老梁死後老唐因為某種原因(很可能是與林大夫的奸情被揭穿)被下放回到自己的老家,他的妻子(孔維)陪著他壹起回老家。小隊長按照母親的意思開著拖拉機去接他們。在他們回到村裏時,瘋媽已經跳河自殺了,自殺時還脫掉了身上所有的衣物。村子裏除了李叔,沒有其他人知道其實老唐就是小隊長的父親(因為他把瘋媽叫做嫂子)。老唐每天帶著壹幫小毛孩打獵吹小號,樂不思蜀。唐妻倍受冷落,在壹個精神極其壓抑又沒有娛樂消遣的年代,很容易的就與小隊長發生了奸情,唐妻告訴小隊長,老唐說她的肚子像天鵝絨。奸情偶然中被老唐發現,第二天老唐用獵槍指著小隊長說:“妳找死”,小隊長說:“我是找死,但我有壹件事不明白,什麽是天鵝絨?”老唐做事有壹個原則:絕不乘人之危。為了讓小隊長死個明白,於是他去了北京找天鵝絨,其實這也是給自己接口和時間去思考,不然不必跑這麽遠去找。在北京找到了老朋友(崔健飾),崔健幫他分析了他老婆偷人,責任不在小隊長身上,也不在他老婆身上,而是在他自己身上。老唐想通了,決定不再買天鵝絨,也不想殺小隊長了。但是小隊長哪壺不開提哪壺,自己也走出村子去買了壹塊天鵝絨料子的獎狀,長了這麽大終於明白了天鵝絨是什麽樣子。他對老唐說“但是妳老婆的肚子不像天鵝絨呀?”,老唐終於做出了壹個為了維護自己的尊嚴的男人都會做出的事情:開槍打死了小隊長。但是他並不知道,他親手打死的是自己的兒子。容易推得,老唐也會因為故意殺人罪被判處死刑。