为啥-3的32位补码是0011...1101啊

verilog中,-4'd12/4=1073741821,我看过很多解答,都说-3的补码是0011...1110,看成十进制就是1073741821,但我不理解,-3的补码不应该是3的补码然后高位全部取1吗?为什么第30位,31位是0?真的不理解,求请教

img

img

计算过程是这样的:先计算-4'd12,然后再“/4”。
12=0000 0000 0000 0000 0000 0000 0000 1100
-12=1111 1111 1111 1111 1111 1111 1111 0100
-12/4等价于右移两位,高位补0。
所以-12/4=0011 1111 1111 1111 1111 1111 1111 1101,转换为十进制即1073741821

说-3的补码是0011...1110
首先这个结论是错误的
32位数的 -3的补码是1111...1101 16进制0xfffffffd 10进制4294967293
书本上 integer mtx_addr 是 32 位的
32 位的赋值用 -4'd12/4 这样 4’d12 去约束是比较别扭的,有些隐含的东西很多人会忽视。
在这里,会将 -4'd12/4 当成 0xfffffff4/4 = 0x3ffffffd = 1073741821
就是说,会把 -4'd12 当成一个无符号的数而不是 -12,计算出的结果就不对了。
一般来说,当变量的位宽小于等于32位时,会将-4'd12 当成一个32位的无符号数 0xfffffff4
我们平常编程时不要这么写
mtx_addr = -12/4 这样写就不会出现这样奇怪的东西了。
当数据位宽大于等于32位时就会出现这样奇怪的结论。 reg[0:4] burst_data 这个数据位只有 5 位,就不会出现这样奇怪的结论了。