我正在为MSP430编译C。我想知道,当字符(或(u)int8_t)的符号扩展到寄存器大小(16位)时,具体的规则是什么?我发现,当目标操作数的MSB将影响指令和所有后续指令的正确结果时,将执行符号扩展。但是,我认为这并不能真正解释这一点。例如,在查看此代码时:
#include <stdint.h>
unsigned char uscfun ( signed char a, signed char b )
{
return(a+b)*2;
}
signed char scfun ( char a, signed char b )
{
return(a+b)*2
我正在编写可以在不同字长(32位、64位等)的体系结构上运行的代码,我想清除某个值的低位字节。有一个宏(MAX)被设置为单词的最大值。例如,在32位系统MAX =0xFFFFFFFFF和64位系统MAX =0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。如果我有一个单词大小的变量,可以是有符号的,也可以是无符号的,我如何用一个表达式(没有分支)来清除变量的低字节?
我的第一个想法是:
value & ~( MAX - 0xFF )
但这似乎不适用于有符号的值。我的另一个想法是:
value =
我偶然发现了这样的代码:
int __min(int a, int b) {
return ((a)-(((a)-(b))&((b)-(a))>>31));
}
我可以想象它与2s补码有关,它只适用于带符号的32位整数,但在那之后我就迷路了。
我找到了,但我不认为这些函数是相关的,或者我错了吗?
所以我有两个问题:
为什么这个功能会起作用?
是否存在(a<b)?a:b不能工作并且这个函数会工作的情况,或者这个函数只是为了好玩而太复杂了?
编辑:函数是为GPU编写的,所以我认为@Banex这样写它的目的是正确的,这样做是为了避免分支。
我不能理解这个移位运算符(c#参考):
class MainClass1
{
static void Main()
{
int i = 1;
long lg = 1;
Console.WriteLine("0x{0:x}", i << 1);
Console.WriteLine("0x{0:x}", i << 33);
Console.WriteLine("0x{0:x}", lg << 33);
}
}
/*