Much of NC 96's route is through undeveloped and rural areas, though it travels through the cities and towns of Virgilina, Oxford, Youngsville, Zebulon, and the Smithfield/Selma area along the way. NC 96 begins at NC 55 at a quiet rural intersection in the far northern edge of Sampson County. From there, NC 96 almost immediately enters Johnston County and winds primarily northward through southern Johnston County; crossing over NC 50 in Peacocks Crossing and Interstate 40 just north of Peacocks Crossroads along the way. Near Four Oaks, NC 96 turns northeastward to parallel Interstate 95 before intersecting and converging with US 701 and crossing over I-95 alongside it. From there, the highways immediately run into US 301, where NC 96 joins US 301, crosses over the far eastern edge of Holts Lake, and enters the Smithfield area. NC 96 goes directly through the downtown districts of both Smithfield and Selma, crossing over Business Route US 70 and the main US 70 highway itself and being joined by NC 39 along the way. NC 96 leaves its concurrency with US 301 and NC 39 almost immediately after traveling through downtown Selma and continues its northbound trek. The rest of the highway's journey through Johnston County is mostly rural, with intersections with NC 42 and NC 231. NC 96 enters eastern Wake County and soon enters Zebulon. The highway crosses over NC 97 in Zebulon's downtown district and crosses over US 64\US 264 on the other side of town. NC 96 then cuts a northwesterly path through the northeastern part of the county, crossing over US 401 near Rolesville and NC 98 near Wake Forest. NC 96 enters the southwestern side of Franklin County, soon entering Youngsville. In Youngsville, NC 96 takes a sharp western turn to join US 1 Alternate for a brief concurrency. Outside of town, NC 96 splits off from US 1 Alternate and crosses over the main US 1 highway before winding a mostly northwestern path through rural Franklin County and Granville County farmland. Shortly after entering Granville County, NC 96 takes a sharp turn northward at a four-way intersection near Brassfield and heads north to an intersection with NC 56 in Wilton. NC 96 continues northward from here until its intersection with Interstate 85 herald's the highway's arrival in Oxford. In Oxford, NC 96 joins US 15to go through Oxford's downtown district before both highways join Business Route US 158 to head northward out of town. NC 96 and Business 158 split off from US 15 to head westward for about a mile before NC 96 splits off northward, where the highway crosses over mainline US 158 before beginning the rest of its almost entirely solo journey through rural northwestern Granville County. NC 96 passes through the tiny unincorporated community of Oak Hill before joining NC 49 less than a mile away from the North Carolina/Virginia border. Together, the two highways continue into Virgilina, where they continue on as Virginia State Route 96 and Virginia State Route 49 respectively. SR 96 ends at US 501 just south of Cluster Springs, Virginia shortly afterwards.
History
The current NC 96 was established in 1940 as a renumbering of NC 562; it ran from NC 56, in Wilton, to Virgilina, Virginia. In 1952, NC 96 was extended south as a new primary routing to Youngsville, replaced NC 98 and NC 264 to Zebulon, new primary routing to Selma, concurrency with US 301 to Four Oaks, and finally new primary routing to end at NC 55. Around 1960, NC 96 was adjusted in the Four Oaks area to accommodate I-95; it was placed on concurrency briefly with US 701, leaving behind part of US 301 and Boyette Road. The first NC 96 existed from 1930-1940; it originally traversed from NC 90, near Taylorsville, south to NC 17, in Hickory. In 1934, it was extended further south to NC 73, in Propst Crossroads, replacing part of NC 17. Between 1931-1936, NC 96 was rerouted at the Catawba River onto a new crossing at Shiloh Church Road. In 1940, the entire route was renumbered to NC 127.
North Carolina Highway 562
North Carolina Highway 562 was established as a new primary routing from NC 56, in Wilton, to Virgilina, at the Virginia state line. In 1940, NC 562 was renumbered in favor of NC 96 to match Virginia.