SQL Server locking is dynamical. It will default to row-level locking, but could also escalate to table or partition level.
With an UPDATE, SQL Server uses mix of update and exclusive locks. Update locks are used while searching for the rows that shoud be updated, and once the row is found they are converted to exclusive locks. Exclusive locks are held until end of transaction.
To find out which lock are actually help by the session, start transaction, execute the update, and then check the sys.dm_tran_locks for the request_session_id in question.
To debug a deadlock, restart the service with trace flag 1222 set. Here's a good intro into solving deadlocks:
http://technet.microsoft.com/en-us/library/ms178104%28v=sql.105%29.aspx