يلقي بين الموقعة وغير الموقعة
سؤال
هل هذا آمن:
int main()
{
boost::int16_t t1 = 50000; // overflow here.
boost::uint16_t t2 = (boost::uint16_t)t1;
std::cout << t1 << " " << t2 << std::endl;
}
لكي أكون أكثر تحديداً: أقوم بتخزين هذه البيانات في جدول يستخدم أنواعًا موقعة في مخططه ، هل من الآمن تخزينها واسترداد هذه البيانات بهذه الطريقة؟
شكرًا!
المحلول
لا ، أعتقد أن هذا هو التنفيذ المحدد. من قياسي C ++ ، §4.7/3
إذا تم توقيع نوع الوجهة ، فسيتم تغيير القيمة إذا كان يمكن تمثيله في نوع الوجهة (وعرض الحقل) ؛ خلاف ذلك ، فإن القيمة هي التنفيذ.
هذا ينطبق على البيان الأول. int16_t
تم توقيعه ، ولا يمكن أن يمثل 50000. وبالتالي فإن قيمة t1
يعتمد على التنفيذ.
عندما تعرف t1
, t2
يضمنه الفقرة 4.7/2 ليكون أدنى uint16_t
معامل متطابق 2^16 t1
. أساسًا، t1
وزارة الدفاع 2^16.
نصائح أخرى
أود أن أقول أنها آمنة ، ولكن لماذا لا تستخدم UINT16_T دون المرور من خلال هذا الممثل المضلل؟
توجد أنواع للتواصل أيضًا ، ليس فقط من أجل عملية التجميع.
تعيين رقم لا يمكن تمثيله في نوع موقّع محدد. ومع ذلك ، فإن التحويل التالي له سلوك محدد قياسي. وبالتالي فإن نتيجة الوظيفة محددة ، إذا كانت هذه آمنة أم لا ، فهي مسألة ذاتية. لكن المحمولة عبر المنصات أو المجمعين ليس كذلك.