8051 16位加法/乘法结果16位而不是32位

Moh*_*aky -2 c 16-bit integer-promotion integer-arithmetic

我有个问题.在此程序中,变量x应设置为0x10000,但在两个操作中结果为0.

这不是主程序,而是查找错误原因的测试.我目前正在使用十六进制输入制作64位乘法器.我使用Keil和Proteus进行了16位乘法运算

int main() {
    unsigned long int x = 0;
    x = 0x8000 * 0x2;
    x = 0x8000 + 0x8000;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 6

文字0x8000属于类型unsigned int.在您的16位机器上,int因此unsigned int具有16位的自然大小,这是C标准所接受的最小值.整数提升规则表示较小的宽度类型被扩展为intunsigned int,但没有进一步(C11 n1570 6.3.1.1p2):

如果a int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它被转换为unsigned int.这些被称为整数促销.58)所有其他类型由整数促销保持不变.

操作数从intunsigned int仅当另一个操作数具有更高的等级时加宽.

这里,使用将包装为0 来计算0x8000+ ,因为可以表示的最大值是.0x8000unsigned intunsigned int0xFFFF

您应该强制至少一个操作数unsigned long使用后缀UL或添加显式强制转换:

int main() {
    unsigned long int x=0;
    /* unsigned long int * int */
    x = 0x8000UL * 0x2;

    /* unsigned long + unsigned int */
    x = (unsigned long)0x8000 + 0x8000;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另请参见在C表达式中,unsigned int和signed int存在,哪种类型将被提升为什么类型?一般性的讨论.