我正在尝试移位一个16位的地址,以便在C中获得一个缓存模拟器的集合ID,但是当我尝试向右移位时,我的数字上多了一个1。
我有0010100010011001的号码。然后我移到左边的3位数,得到0100010011001000。到目前一切尚好。但是,然后我尝试移到正确的6位数,结果是0000010100010011而不是0000000100010011。我所有的int都是无符号的,当我尝试并移位时,它只加1。
我尝试和转换的代码如下所示。在我的例子中,tag_size是3,b是6。
unsigned int temp = addr << tag_size;
unsigned int temp1 = temp >> b;
unsigned int setid = temp1 >> tag_size;
发布于 2019-04-10 00:49:25
如今,16位int
并不常见。您可以尝试将变量定义为short
,通常为16位。这完全取决于您使用的机器。如果您正在寻找16位整数,您也可以使用uint16
。
看起来问题可能是因为你正在使用的unsigned int
实际上并不是克里斯蒂安·吉本斯在评论中提到的16位。当你将0010100010011001
向左移动3位数字时,你最终得到的是10100010011001000
,最左边的1并没有像你预期的那样在16位整数中被移除,然后当你再次向右移动时,你得到了你不期望的增加的1。
你可以把你的代码改成这样,它应该会像你最初期望的那样工作:
uint16_t temp = addr << tag_size;
uint16_t temp1 = temp >> b;
uint16_t setid = temp1 >> tag_size;
发布于 2019-04-10 02:02:43
您应该使用掩码并选择您感兴趣的位;例如:
unsigned int temp = (addr << tag_size) & 0xffffu; // keep 16 low bits
unsigned int temp1 = temp >> b;
unsigned int setid = temp1 >> tag_size;
如果我明白你想要什么,同样的事情也可以用
unsigned int temp = addr & (0xffffu >> tag_size); // keep 16 low bits
unsigned int setid = temp >> b;
或
unsigned int temp = (addr << tag_size) & 0xffffu; // keep 16 low bits
unsigned int setid = temp >> (b + tag_size);
这使得代码独立于unsigned int
大小,C保证至少为16位。
https://stackoverflow.com/questions/55597039
复制相似问题