有不同的。关键是printf()的处理。printf("%d\n", a),是拿a的值作为int处理,尽管a实际上是8位的char,但printf()把这个char扩展为32位的int(因为你指定了"%d"是把数值解释为int的),这样在前面补0;对printf("%d\n", ~a),是拿a的值进行~a运算,结果另存为一个32位的带符号int("%d"是带符号的),这样它的结果就是-101。而我现在写的,是把~100直接赋值给unsigned char,强制为8位的,然后让printf()扩展,也只不过在前面补0,不会影响结果。