这是一个家庭作业问题。
我需要将无符号8位数转换为32位有符号数。
例如,我有这个无符号的8位数:1111 1010
因此,在32位签名中,它应该是1111 1111 1111 1111 1111 1111 1111 1010
我该怎么做?我知道>>
只有一个带有1的填充,当它是一个有符号的int时所以我可以在向右移位之前将其转换为有符号的int。
唯一的问题是我对我的问题有限制,这说明我需要制作一个“只使用左右移位和一次减法”的功能。
答案 0 :(得分:2)
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教科书和采用类似风格的其他课程中,每隔一段时间就会出现这个问题,这就是我遇到这个问题的方式。花了一些时间,但是这种方法很简洁,可以应用于其他需要算术右移而无需显式强制转换的情况(这是我认为问题的构想)。
答案 1 :(得分:0)
通过签名的8位进行转换应该可以解决问题吗?
uint8_t start = 0xFF;
int32_t end = (int8_t)start;
或者你不允许在你的家庭作业中这样做吗?
在这种情况下,由于右移进行符号扩展,向上然后向下移动将起作用。
uint8_t start = 0xFF;
int32_t end = (start << 24) >> 24;
答案 2 :(得分:-2)
你需要一个合适的32位掩码。并将掩码的最右边8位设置为8位无符号整数。这会给你结果。
首先,你应该自己尝试一些代码,然后尝试寻求帮助。