有符号数据类型口算方法: 取反自增

225 阅读1分钟

C 语言编程时, 变量的数据类型 有符号 和 无符号

显然的区别是, 有符号可以表示 负数和正数, 但是有符号类型可以表达的 正数的数值范围大约为 无符号类型的一半.

有时候, 通信数据获取的数值定义为 无符号类型, 因为数据流获取后, 有时候会进行移位运算, 这时为了保持原数据, 不可以使用有符号类型进行移位, 有符号类型移位会保留符号位,只移动数值位, 而无符号类型移位操作时, 是将所有bit位统一位移,不存在首位符号位的保留动作. 这是一个容易忽略的小问题.

需要将原数据 分别转换为 无符号和有符号数值, 方便的办法是

将符号位为1, 也就是隐含负数的数据, 可以进行如下转换:

将符号位为1的数据, 自减1, 仍然为有符号值,保持是负数, 然后进行 位取反, 就获得了一个正数值, 这个正数值刚好等于 负数的绝对值.

例如 0xFF, unsigned char 类型 数值是 256; char 类型数值是 -1; 将 0xFF -1 , 获得 0xFE, 位取反, 获得 1, 这是-1的绝对值. 举一反三, 直接将 0xFF 取反, 获得0, 自加1, 获得1 这也是-1 的绝对值.

有符号数的口算方法:

自减,取反,获得原负数的绝对值
取反,自增,获得原负数的绝对值.