这是一个家庭作业问题。
我需要将一个无符号的 8 位数字转换为一个有符号的 32 位数字。
例如,我有这个无符号的 8 位数字:1111 1010
所以在 32 位签名中它应该是1111 1111 1111 1111 1111 1111 1111 1010
我怎样才能做到这一点?我知道>>
只有在它是有符号整数时才用 1 填充,所以我可以在右移之前将它转换为有符号整数。
唯一的问题是我对我的问题有限制,这表明我需要创建一个“仅使用左移和右移以及一个减法”的函数。
这是一个家庭作业问题。
我需要将一个无符号的 8 位数字转换为一个有符号的 32 位数字。
例如,我有这个无符号的 8 位数字:1111 1010
所以在 32 位签名中它应该是1111 1111 1111 1111 1111 1111 1111 1010
我怎样才能做到这一点?我知道>>
只有在它是有符号整数时才用 1 填充,所以我可以在右移之前将它转换为有符号整数。
唯一的问题是我对我的问题有限制,这表明我需要创建一个“仅使用左移和右移以及一个减法”的函数。
unsigned givenByte = 0xFA; /*This can be any given byte that we want to pad.*/
unsigned foo = (givenByte >> 7) << 8; /*This leaves us with only the most significant bit of the original byte shifted left by one place.*/
unsigned result = givenByte - foo;
这应该返回类似于有符号算术移位的结果,除了这些操作是在无符号整数上执行的并且只使用移位和一个减法。
givenByte = 1111 1010
foo = 0000 0000 0000 0000 0000 0001 0000 0000
result = 1111 1111 1111 1111 1111 1111 1111 1010
这个问题每隔一段时间就会出现在 CMU 教科书和其他采用类似风格的课程中,这就是我遇到这个问题的方式。花了一些时间,但这种方法很简洁,可以应用于我们需要算术右移而无需显式转换的其他情况(我认为这是问题的框架)。
通过有符号的 8 位进行转换应该可以解决问题吗?
uint8_t start = 0xFF;
int32_t end = (int8_t)start;
或者你不允许在你的家庭作业中这样做?
在这种情况下,由于右移进行符号扩展,因此向上移动然后向下移动将起作用。
uint8_t start = 0xFF;
int32_t end = (start << 24) >> 24;
您需要一个适当的 32 位掩码。然后将掩码的最右边 8 位设置为 8 位无符号整数。这会给你结果。
一开始你应该自己尝试一些代码,然后尝试寻求帮助。