一、原码反码补码
1、原码:最高位是符号位,正数符号位为0,负数符号位为1。其余是数值。符号位加数值组成原码。
2、反码:正数反码是原码,负数反码是除了符号位外其他位取反。
3、补码:正数补码是原码,负数补码是其反码加1。
二、问题
1、在学习verilog涉及运算模块难免用到加法器、乘法器、除法器,那么他们究竟要如何做才能支持正负数运算而不引入过多的处理呢?
2、c/c++是如何处理正负数数值的,以及无符号、有符号的强制类型转换是怎么赋值的?
三、记录
1、c/c++的所有数值都是以补码的方式存储在内存里。
2、c/c++的无符号、有符号相互赋值只是在做内存copy,长有符号类型赋值到短无符号类型会截断高位、短有符号类型赋值到长无符号类型会直接赋值到低位,哪怕是符号位。
3、c/c++的有符号的长短类型间赋值会关注符号位
四、verilog的符号运算
1、verilog依旧是补码的计算,补码天然具有把” 减法变加法的功能 “。这样只需要加法器就能模拟成减法器,而乘法器跟除法器在涉及有符号时就不需要考虑符号位的问题,直接当无符号计算。
2、通过上诉计算出来的依旧是补码,想要拿到原码需要经过逆运算电路做转换,不过大多的情况不会需要拿到原码,因为数值以补码保存。