C 数字的二进制表示
我有一个32位寄存器,其中。首先将数据移入和移出芯片MSB。逻辑高(1)表示读取,逻辑低(0)表示写入。我的协议告诉我,我应该使用前7位作为地址,这意味着它将只引用前7位作为地址,第8位是读/写。如果我想从位置C 数字的二进制表示,c,C,我有一个32位寄存器,其中。首先将数据移入和移出芯片MSB。逻辑高(1)表示读取,逻辑低(0)表示写入。我的协议告诉我,我应该使用前7位作为地址,这意味着它将只引用前7位作为地址,第8位是读/写。如果我想从位置0x12读取值0x200,我应该将其设置为0x13000200或0x25000200 当我执行0x12000000(地址)|0x01000000(读取逻辑为1)时,它将给我0x13000000。所以我的疑问是它是否会从地址0x12或0x13或其他位置读取,因为地址的前7位是访问的,当地址为
0x12
读取值0x200
,我应该将其设置为0x13000200或0x25000200
当我执行
0x12000000
(地址)|0x01000000
(读取逻辑为1)时,它将给我0x13000000
。所以我的疑问是它是否会从地址0x12
或0x13
或其他位置读取,因为地址的前7位是访问的,当地址为0x12时,这个逻辑是正常的,但对于0x13,它的位会混淆,还是应该使用第二个“0x25000200”7位二进制中的0x12是10010,我将为读取添加位1,因此它将变成100101,依次为十六进制,因为这将是0x25。所以我用7位表示地址本身,第8位表示为read,所以最后它将类似于0x25000200
0x13
binary是0001 0011,那么在这种情况下如何表示int?因为第8位已经是逻辑1,我该如何读取呢?如果协议按照您所说的方式工作(前7位表示地址,然后1位表示r/w,其余24位表示数据),那么您是正确的。请参见二进制十六进制值的“爆炸”:
value address r/w
0x12 = 0001001 0 You're Writing address 0001001
0x13 = 0001001 1 You're Reading address 0001001
我认为这是错误的:“如果我想将值0x200写入位置0x12,我可以给出0x12000200”。应该是0x14000200。 因为:二进制中的地址0x12是“0001-0010”,因为您只考虑地址的前7位和读/写(1/0)的1位,所以前8位应该是“0010-0011”读或“0010-0010”写 这就是地址左移一个位置,并带有读/写位
(00010010根据您的协议:- 32位寄存器=> 下面是分别在位置0x12和0x13读取/写入的位设置 读取(假设数据为0作为读取操作):- 从地址0x12读取- 0x25000000 从地址0x13读取- 0x27000000 写入(假设数据为0x200):- 写入地址0x12- 0x24000200 写入地址0x13-
0x26000200您的地址和读/写字段重叠。如果最重要的7位是地址,那么结果应该是0x24000200。是否发生了奇怪的事情?如果协议说前7位访问为地址,那么只有那么多位将被解释为地址,第8位肯定会被解释为R/W位仅限。因此类似于:(7+1+24=32)。如果协议如此定义。在您的符号中,读/写位必须是最高的:
0x80
(在第一个字节上),而不是0x01
。