It is unclear till the moment one reads how CF flag is defined. Intel CPU docs manual says:
If the result of an arithmetic operation is treated as an unsigned integer,
the CF flag indicates an out-of-range condition
Negating anything which is treated as unsigned is obviously invalid since no unsigned value can have its sign flipped and still remain unsigned (unless it is zero).
So although using pencil and paper method you get completety opposite results: 'pencil carry = 1' when negating zero and 'pencil carry = 0' when negating any other bit pattern.
Probably this is why we have 'carry FLAG' in flag register and NOT 'carry BIT'.
And again - carry flag is out there to indicate that result of an operation on operand(s) (treated as unsigned) becomes out of allowed 'unsigned range' for particular number of bits.
If value which you negate is treated as signed - you should look at Overflow Flag.
The key point here is: 'carry FLAG' is NOT 'carry BIT'. It sometimes bahaves like one but not always.
BTW: It's not that only x86/64 does that. This is the same for example in Atmel's AVRs.
ARM will probably do the same since their manuals say that:
For a subtraction, including the comparison instruction CMP and the negate
instructions NEGS and NGCS, C is set to 0 if the subtraction produced a
borrow (that is, an unsigned underflow), and to 1 otherwise.
and in general, ARM's doc call Carry Flag - a Carry/borrow flag so again it should not be treated as Carry BIT
1 - 2
is negative, it results in a borrow - thus, the carry flag is set. – Chalutzsub
doesn't set flags according to adding the inverse, it sets flags according to an actual borrow. Arithmetic identities and EFLAGS. CF is the borrow output from the binary subtraction. – Heth