لماذا لا يعطي برنامج التحويل البرمجي خطأ عند تعيين القيمة الموقعة إلى عدد صحيح غير موقعة؟ - C ++.

StackOverflow https://stackoverflow.com/questions/765709

سؤال

أنا أعرف غير موقعة لا يمكن أن تعقد القيم السلبية. لكن الكود التالي يجمع دون أي أخطاء / تحذيرات.

unsigned int a = -10;

عندما أطبع المتغير أ, ، أحصل على قيمة خاطئة مطبوعة. إذا لم تتمكن المتغيرات غير الموقعة على القيم الموقعة، فلماذا تسمح لهم الجوائيون بتجميعها دون إعطاء أي خطأ / تحذير؟

أي أفكار؟

يحرر

مترجم: VC ++ مترجم

المحلول

بحاجة إلى استخدام مستوى التحذير 4.

هل كانت مفيدة؟

المحلول

Microsoft Visual C ++:

تحذير C4245: "تهيئة": التحويل من "Int" إلى "غير موقعة" عدم تطابق موقعة / غير موقعة

على مستوى التحذير 4.

G ++.

يعطيني التحذير:

تحذير: تحويل القيمة السلبية -0x00000000a' toغير موقعة

دون أي توجيهات.

مجلس التعاون الخليجي

عليك أن تستعمل:

GCC Main.c -Wconversion.

والتي سوف تعطي التحذير:

تحذير: عدد صحيح سلبي يتم تحويله ضمنيا إلى نوع غير ماني

لاحظ أن - لن تمكن هذا التحذير.


ربما تحتاج فقط إلى تحويل مستويات التحذير الخاصة بك.

نصائح أخرى

تحويل أ signed int إلى unsigned int هو شيء معروف في المعيار ج ك "تحويل حسابي عادي"، لذلك ليس خطأ.

غالبا ما لا يصدر المترجمات في كثير من الأحيان تحذيرا في هذا الافتراضي هو أنه عادة ما يتم ذلك في التعليمات البرمجية سيكون هناك الكثير من التحذيرات "الإيجابية الخاطئة" الصادرة بشكل عام. هناك الكثير من الشفرة هناك يعمل مع signed int القيم للتعامل مع الأشياء التي هي غير موقعة بطبيعتها (حساب أحجام المخزن المؤقت على سبيل المثال). من الشائع أيضا مزج القيم الموقعة وغير الموقعة في التعبيرات.

هذا لا يعني أن هذه التحويلات الصامتة ليست مسؤولة عن الأخطاء. لذلك، قد لا تكون فكرة سيئة لتمكين التحذير من أجل رمز جديد بحيث يكون "نظيف" من البداية. ومع ذلك، أعتقد أنك ربما تجد أنها ساحقة إلى حد ما للتعامل مع التحذيرات الصادرة عن القانون الحالي.

-10 تحليل كقيمة عدد صحيح، وتقليل int إلى int غير الموقعة مسموح به. لمعرفة أنك تقوم بعمل شيء خاطئ، يجب على المترجم التحقق مما إذا كان عدد صحيح (-10) سلبي أو إيجابي. كما هو أكثر من مجرد فحص من النوع، أعتقد أنه تم تعطيل مشاكل الأداء.

للحصول على برنامج Compiler GCC يمكنك إضافة

gcc -Wconversion ...

وهذا سوف ينتج التحذير التالي

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'

أنا أستخدم G ++ 4.9.2 وتحتاج إلى استخدام -WSign-التحويل لجعل هذا التحذير يظهر.

gcc.gnu.org.: تحذيرات حول التحويلات بين الأعداد الصحيحة الموقعة وغير الموقعة يتم تعطيلها بشكل افتراضي في C ++ ما لم يتم تمكين التحويل الإلكتروني بشكل صريح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top