ما هي حجة printf التي تنسيقات طويلة؟
-
09-06-2019 - |
سؤال
ال printf
تأخذ الدالة نوع وسيطة، مثل %d
أو %i
ل signed int
.ومع ذلك، لا أرى أي شيء ل long
قيمة.
المحلول
ضع l
(حرف صغير L) مباشرة قبل المحدد.
unsigned long n;
long m;
printf("%lu %ld", n, m);
نصائح أخرى
أعتقد أنك تقصد:
unsigned long n;
printf("%lu", n); // unsigned long
أو
long n;
printf("%ld", n); // signed long
على معظم المنصات، long
و int
بنفس الحجم (32 بت).ومع ذلك، فإنه يحتوي على محدد التنسيق الخاص به:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
بالنسبة لـ 64 بت، قد ترغب في الحصول على long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
وبالطبع الأمر مختلف في نظام Windows:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
في كثير من الأحيان، عندما أقوم بطباعة قيم 64 بت، أجد أنه من المفيد طباعتها بالنظام السداسي (عادةً بأرقام كبيرة، تكون مؤشرات أو حقول بت).
unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"
سوف طباعة:
0x00000000DEADBEEF
راجع للشغل، كلمة "طويلة" لم تعد تعني الكثير بعد الآن (على نظام التشغيل x64 السائد)."int" هو الحجم الافتراضي للنظام الأساسي، وعادةً ما يكون 32 بت.عادة ما يكون "الطويل" بنفس الحجم.ومع ذلك، لديهم دلالات مختلفة لقابلية النقل على الأنظمة الأساسية القديمة (والأنظمة الأساسية الحديثة المدمجة!)."طويل طويل" هو رقم 64 بت وعادة ما يقصد الناس استخدامه إلا إذا كانوا يعرفون حقًا ما كانوا يفعلونه في تحرير جزء من التعليمات البرمجية المحمولة لـ x-platform.وحتى في هذه الحالة، ربما كانوا سيستخدمون ماكرو بدلاً من ذلك لالتقاط المعنى الدلالي للنوع (على سبيل المثال، uint64_t).
char c; // 8 bits
short s; // 16 bits
int i; // 32 bits (on modern platforms)
long l; // 32 bits
long long ll; // 64 bits
في الماضي، كان "int" يبلغ 16 بت.كنت تعتقد أنه سيكون الآن 64 بت، لكن لا، كان من الممكن أن يسبب ذلك مشكلات جنونية في قابلية النقل.وبطبيعة الحال، حتى هذا يعد تبسيطًا للحقيقة الغامضة والغنية بالتاريخ.يرى ويكي:عدد صحيح
يعتمد ذلك على ما إذا كنت تشير إلى حرف التنسيق الطويل غير الموقع "%lu"
.إذا كنت تشير إلى علامة طويلة، فإن حرف التنسيق هو "%ld"
.
%ld
يرى printf
مرجع على cplusplus.com
في حال كنت تتطلع إلى الطباعة unsigned long long
كما كنت، استخدم:
unsigned long long n;
printf("%llu", n);
بالنسبة لجميع المجموعات الأخرى، أعتقد أنك تستخدم الجدول من دليل الطباعة, ، مع أخذ الصف، ثم تسمية العمود لأي نوع تحاول طباعته (كما أفعل مع printf("%llu", n)
فوق).
أعتقد أن الإجابة على هذا السؤال بشكل نهائي تتطلب معرفة اسم المترجم وإصداره الذي تستخدمه والنظام الأساسي (نوع وحدة المعالجة المركزية ونظام التشغيل وما إلى ذلك) الذي يتم التجميع من أجله.