类型为 ap_[u]<>
的变量通常可在涉及 C/C++ 运算符的表达式中随意使用。这可能导致某些意外行为。此类行为将在下文中详细讲解。
从较窄的变量赋值到较宽的变量时的零位扩展和符号位扩展
将位宽较窄的有符号 (ap_int<>
) 变量赋值到较宽的变量时,该值将采用符号位扩展以扩展至目标变量的宽度,这与其是否有符号无关。
同样,无符号的源变量在赋值前将采用零位扩展。
可能需要进行显式源变量类型强制转换,以确保赋值行为符合期望。请参阅以下示例:
ap_uint<10> Result;
ap_int<7> Val1 = 0x7f;
ap_uint<6> Val2 = 0x3f;
Result = Val1; // Yields: 0x3ff (sign-extended)
Result = Val2; // Yields: 0x03f (zero-padded)
Result = ap_uint<7>(Val1); // Yields: 0x07f (zero-padded)
Result = ap_int<6>(Val2); // Yields: 0x3ff (sign-extended)
从较宽的变量赋值到较窄的变量时的截位
将较宽的源变量赋值到较窄的变量会导致值被截位。超出目标变量的最高有效位 (MSB) 位置的所有位都将丢失。
截位期间对于符号信息不进行任何特殊处理。这可能导致出现意外行为。显式类型强制转换可有助于避免此类意外行为。