Findbugs تحذير: صحيح التحول بنسبة 32 - ماذا يعني ذلك؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد مسح شفرة المصدر طرف ثالث باستخدام Findbugs (لمجرد أن يكون حذرا قبل الاندماج في ذلك الألغام)، ووجد التحذير التالي:

long a = b << 32 | c
<اقتباس فقرة>   

وعلة: صحيح التحول من معرف 32 نمط:   ICAST_BAD_SHIFT_AMOUNT، اكتب: BSHIFT،   الفئة: صحة

     

والرمز يؤدي إلى تحول عدد صحيح   كمية ثابتة خارج النطاق   0..31. تأثير هذا هو استخدام أقل 5 قطع من قيمة عدد صحيح   أن تقرر كم لنقل من قبل. هذه   ربما لا تريد كان متوقعا، و   على الأقل مربكة.

ويمكن لأي شخص يرجى توضيح ما يعنيه بالضبط يعني أعلاه؟

وشكرا! (أنا تماما مبتدئ في البرمجة جافا)

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

المحلول

لغة جافا المواصفات :

<اقتباس فقرة>   

وإذا كان نوع ترقيته من المعامل الأيسر هو عدد صحيح، وتستخدم فقط بت أدنى ترتيب خمسة من المعامل الأيمن والمسافة التحول. يبدو الأمر كما لو تعرضوا المعامل الأيمن إلى أحادي المعامل المنطقي AND عامل و (§15.22.1) مع 0x1f قيمة قناع. وبالتالي فإن المسافة تحول المستخدمة فعليا هي دائما في النطاق من 0 إلى 31، ضمنا.

وإذا كان الأمر كذلك ب هو عدد صحيح، والتعبير مطابق ل

long a = b | c;

والذي أنا جدا شك ما هو المقصود. كان ينبغي أن يكون على الأرجح

long a = ((long) b << 32) | c;

و(إذا ب بالفعل منذ فترة طويلة، هو رمز الصحيح وFindBugs مخطئ عن علة).

نصائح أخرى

تعديل: المشكلة ينبع من شبه المؤكد من حقيقة أن "ب" هو "كثافة" وليس 'طويلة'

.

في C، إذا 'ب' هو عدد صحيح بدلا من فترة طويلة وكنت SHIFT الأيسر بنسبة 32 بت، <الصورة> تم إزالة كافة البتات من القيمة الأصلية، لذلك فإن النتيجة من التعبير العام أن تكون هي نفسها ك 'ج' كنت استدعاء سلوك غير معرف، لذلك أي نتيجة غير جائز. تعرف جافا الامور بشكل مختلف - كما لوحظ في التعليق بواسطة راسموس فابر والجواب المختار - ويفعل التحولات أطول مما ينبغي MODULO الحد الأقصى لعدد البتات التي يمكن أن تحول. [يبدو بطريقة غريبة في القيام بأعمال تجارية. ربما كنت قد رتبت لاستثناء بلغة ديه منها. ومع ذلك، يتم تعريفه بشكل واضح، وهو أكثر أهمية من بالضبط ما هو تعريف] والإكراه للا تحدث أثناء تقييم التعبير 64-بت؛ ذلك يحدث عندما يكون التعبير كاملة ويحدث المهمة.

والإشارة إلى 5 بت هو ... فضول. وهذا يعني أنه إذا كنت SHIFT الأيسر من، مثلا، 48، أو ثنائي 110000، فإنه هو نفسه يحولون التي كتبها 16. اليسار أو، بدلا من ذلك، "x << n" هو نفسه "x << (n % 32)".

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