كيف يتعامل C مع حرفي عدد صحيح مع الأصفار الرائدة، وماذا عن Atoi؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

عند إنشاء عدد صحيح مع الأصفار الرائدة، كيف تتعامل معها؟ هل هو مختلفا عن إصدارات مختلفة من ج؟

في حالتي، يبدو أنهم سقطوا (ولكن ربما هذا ما يفعله طباعة؟):

#include <stdio.h>

int main() {
    int a = 005;
    printf("%i\n", a);
    return 0;
}

أعلم أنني أستطيع استخدام printf إلى لوحة مع 0s، لكنني أتساءل فقط كيف يعمل هذا.

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

المحلول

تشير الأصفار الرائدة إلى أن الرقم يتم التعبير عنه واثال, أو قاعدة 8؛ وبالتالي، 010 = 8. إضافة الأصفار الرائدة الإضافية ليس لها أي تأثير؛ تماما كما تتوقع في الرياضيات، X + 0 * 8 ^ n = x؛ لا يوجد تغيير في القيمة من خلال تقديم تمثيلها لفترة أطول.

مكان واحد غالبا ما تراه هذا في أوضاع ملف UNIX؛ 0755 يعني في الواقع 7 * 8 ^ 2 + 5 * 8 + 5 = 493؛ أو مع ukasks مثل 0022 = 2 * 8 + 2 = 10.

atoi(nptr) يعرف بأنه يعادل strtol(nptr, (char **) NULL, 10), ، إلا أنه لا يكتشف الأخطاء - على هذا النحو، atoi() يستخدم دائما عشري (وبالتالي يتجاهل الأصفار الرائدة). strtol(nptr, anything, 0) هل ما يلي:

قد تبدأ السلسلة بمبلغ تعسفي من المساحة البيضاء (كما هو محدد isspace(3)) تليها واحدة اختيارية '+' أو '-' إشارة. إذا كانت القاعدة صفرية أو 16، فقد تتضمن السلسلة "0x" بادئة، وسيتم قراءة العدد في قاعدة 16؛ خلاف ذلك، يتم أخذ قاعدة صفرية ك 10 (عشري) ما لم يكن الحرف التالي '0', ، في هذه الحالة يتم أخذها 8 (Octal).

لذلك يستخدم نفس القواعد كمبرمج C.

نصائح أخرى

كن حذرا!

في هذا البيان 005 هو ثابت ثماني.

int a = 005;

في هذه الحالة، لا يهم لأن ثابت ثماني رقم واحد لديه نفس القيمة مثل ثابت العشرية المكافئة ولكن في C: 015 != 15

ما إذا كان يتم التعبير عن عدد صحيح حرفي في Octal أو عشري أو ست عشري، بمجرد تحليله من قبل المحول البرمجي يعامل فقط كقيمة. كيف يتم إخراج عدد صحيح عبر printf يعتمد فقط على نوعه وقيمته وحديدات التنسيق (واللطقية النشطة).

حقيقة أن الصفر الرائد يشير إلى رقم هو ثماني هو شيء نسيانه في كثير من الأحيان. لقد رأيت أنه يسبب الارتباك عدة مرات، مثل عندما حاول شخص ما إدخال عنوان IP باستخدام تنسيق لطيف للغاية للأثوام:

192.168.010.073

وتفسر المحلل المحللان آخر 2 وثتميات كأرقام أوكتال.

الشيء الوحيد الأسوأ من استخدام C's المؤسفة لأصفار الأصفار الرائدة لعصير رقم برقم هو معالجة جافا سكريبت من الأصفار الرائدة بعض الأحيان قم بعمل عدد ثماني (الرقم هو Octal إذا كانت بقية الأرقام موافق - أقل من 8 - عشري على خلاف ذلك). في جافا سكريبت، (017 == 15) لكن (018 == 18).

أفضل أن يكون هناك خطأ؛ في الواقع كنت أفضل إسقاط الدعم الحرفي ثماني تماما. على الأقل استخدام بادئة أكثر في وجهك، مثل ربما

0t10  (ocTal 8)
0k17  (oKtal 15)

لكنني على بعد حوالي 35 عاما بعد فوات الأوان مع اقتراحي.

عدد مع الصفر الرائدة يعني ترميز ثماني في جميع إصدارات C. 011 == 9 == 0x9.

Octal هو نظام ترقيم يعتمد على 8 (بدلا من 10 لمدة عشرية أو 16 لسدثة). وبالتالي 011 == 1*8 + 1, 013 == 1*8 + 3, ، إلخ.

يجب أن تحاول:

int a = 5;
printf("%03i\n", a);

0 تعني "الوسادة بأصفار الأصناف"، 3 هي المدة المطلوبة للإخراج.

يحرر: آسف، لقد قرأت سؤالك بسرعة كبيرة - الآن أراك طلبت عن شيء مختلف تماما. ومع ذلك، سأترك هذا كما هو، لأنه قد يكون مفيدا لشخص آخر.

رقم مع الرائدة 0 تشير إلى أن الرقم هو واثال رقم. تسمى عدد صحيح حرفي. وبعد تستطيع ايضا استخذام 0b للتدليل عدد ثنائي, ، بالنسبة عدد سداسي عشري أنه 0x أو 0X. وبعد لا تحتاج إلى كتابة أي شيء ل عدد عشري. وبعد انظر رمز رفع الصوت عاليا.

#include<stdio.h>

int main()
{
    int binary = 0b10;
    int octal=010;
    int decimal = 10;
    int hexa = 0x10;
    printf("%d %d %d %d\n", octal, decimal, hexa, binary);
}

للمزيد من المعلومات قم بزيارة البرنامج الدراسي.

لا تملك الأعداد الصحيحة "zeros الرائدة" A 5 هي 5، يمكنك كتابة تمثيل السلسلة مع الرائدة 0 إذا كنت ترغب في ذلك، لأن لديك معدلات طباعة الطباعة.

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

الرائدة في الأصفار يجب أن تفعل بحتة مع تمثيل سلسلة عدد صحيح. للطباعة مع الأصفار الرائدة، استخدم "٪ 03D". هذا سيضمن طول الحقل 3.

بشكل عام، "٪u003Cx> D "سيقوم بطباعة أحرف X عددا صحيحا وسيل وسادة مع المساحات الرائدة."٪ 0u003Cx> D "سوف تفعل الشيء نفسه ولكن وسوف وسادة مع الأصفار الرائدة.

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