По вопросу о численности обеих армий в научной литературе существуют разногласия, отражающие некоторую неясность источников. Полибий (III, 113—114) определенно говорит, что у римлян было до 80 тыс. человек пехоты и около 6 тыс. конницы; у карфагенян — пехоты немного больше 40 тыс., а конницы до 10 тыс. Ливий (XXII, 36) не так категоричен, приводя со слов своих источников разные цифры, в том числе, как максимум, и цифру 8 легионов, что вместе с союзниками должно было также составить около 80 тыс. Количество карфагенян он определяет, как и Полибий, в 50 тыс. Поэтому, хотя большинство ученых принимает цифры Полибия, существует мнение, что у римлян было только от 40 до 50 тыс. пехоты, а у Ганнибала — около 35 тыс. (относительно количества конницы разногласий нет). Это мнение опирается, кроме Ливия, на общие соображения. Полагают, что окружение римской армии и почти полное ее уничтожение были бы невозможны при том соотношении сил, какое дает Полибий. На это можно возразить, что искусное расположение пехоты и численное превосходство конницы Ганнибала делают его победу теоретически вполне возможной. Канны не подействовали бы так ошеломляюще на современников и не вошли бы в историю военного искусства как нарицательное имя, если бы соотношение сил было более равномерным. Поэтому нам кажется, что нет серьезных оснований отказываться от цифр Полибия.
Труднее решить вопрос, на каком берегу Ауфида, на правом или на левом, происходило сражение. И Полибий, и Ливий говорят о том, что правое крыло римлян примыкало к реке, а фронт был обращен к югу. Если это так, то битва происходила на правом берегу. Но тогда придется допустить, что римляне своим тылом были обращены к морю, а это тактически было бы крайне рискованно, и вряд ли римское командование приняло бы бой при таких условиях. Эта кардинальная неясность разбила весь ученый мир на два враждебных лагеря: на сторонников правого и сторонников левого берега. Но так как этот вопрос не имеет принципиального значения, то мы оставим его нерешенным.
Построение обеих армий рисуется следующими чертами. На правом фланге римлян, примыкавшем к Ауфиду, стояла немногочисленная конница римских граждан; главная масса союзной кавалерии была сосредоточена на левом фланге, обращенном к равнине. Пехота находилась в центре, построенная сомкнутой плотной массой на сокращенных интервалах между манипулами, так что всему строю была дана большая глубина, чем ширина. Это построение имело целью прорвать мощным ударом пехоты фронт противника. Впереди войска в некотором отдалении стояли легковооруженные. Римляне были обращены лицом к югу, так что сильный южный ветер гнал на них тучи пыли, поднятой карфагенянами.
Ганнибал построил свою пехоту в форме полумесяца, обращенного к противнику выпуклой стороной. В центре его он поставил галлов и иберов. На обоих флангах, оттянутых назад, были расположены ливияне, считавшиеся лучшей частью карфагенской пехоты. Иберская и галльская кавалерия стояла у реки на крайнем левом фланге, а на правом крыле находились нумидяне.
Битва, как обычно, началась столкновением легковооруженных, после чего в дело вступили главные силы. Римская пехота всей своей тяжестью обрушилась на вражеский центр, который под ее страшным давлением стал прогибаться внутрь, так что выпуклая линия карфагенского фронта начала превращаться в вогнутую. По мере того как римляне все глубже вклинивались в расположение противника, их колонна сжималась с боков и вытягивалась в длину. Прежде чем карфагенский центр был прорван, Ганнибал дал знак ливийской пехоте, которая со свежими силами ударила во фланги римлянам.
Одновременно с этим развернулся кавалерийский бой. Более сильная галльская и иберская конница опрокинула римских всадников на правом крыле, после чего часть галлов и иберов была послана на поддержку нумидян, а часть стала заходить в тыл римской пехоте. Получив поддержку, нумидийская конница сломила римских союзников, обратив их в беспорядочное бегство.
Теперь окружение римской пехоты было завершено. Сжатая с флангов ливиянами, поражаемая с тыла конницей, она уже не в силах была прорвать фронт галлов и иберов и очутилась в ужасном мешке, подготовленном для нее Ганнибалом. Римляне, сбитые в кучу на тесном пространстве и лишенные свободы маневрирования, служили готовой мишенью для врага: ни один дротик, ни один камень из пращи не попадали мимо цели.
Из 80 тыс. римлян на поле боя полегло около 70 тыс., остальные попали в плен или разбежались. Среди беглецов был и Теренций Варрон. Эмилий Павел погиб в бою. Потери Ганнибала были невелики: меньше 6 тыс., из которых около 4 тыс. — галлы.