سؤال

انا تهيئة غير موقعة قصيرة الباحث مع أ = 0xff (كل بت تعيين).ثم تعيين b إلى a>>7 التي ينبغي أن العائد (0000 0001) وأنه لا.ولكن الشيء الغريب هو أنه عندما كنت في تعيين c a<<7, ليس أي ما يعادل (1000 0000).أنا جربت هذا من قبل إخراج 0x80 (الذي هو 1000 0000) ، ج ، ولكنها ليست نفس الشيء.

هنا بعض التعليمات البرمجية:

unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80

أنا غير متأكد ما هي المشكلة.أي مساعدة هي موضع تقدير.شكرا

P. S.من قبل "إخراج" أعني إخراج 0x80 و ج في العشرية و عرافة شكل.

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

المحلول

وعلى كثافة العمليات قصيرة ديها 16، وليس بت فقط 8.

وهكذا هل من المحتمل أن يحصل "0111 1111 1000 0000" نتيجة من عشرية 0xFF << 7.

نصائح أخرى

لا اعتقد في أنواع قليلا، واستخدام <stdint.h>


وهناك كثافة العمليات قصيرة <م> "عادة" لديها 16 بت. في الواقع، وأنا متأكد من أنه دائما لديه 16 باستثناء أجهزة الكمبيوتر المريخ، ولكن هذا ليس شيئا الوعود القياسية.

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

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;

والقيام بذلك سيؤدي إلى تفادي تخمين يست يمين تماما الخاص بك في التمثيل قليلا من short. لسبب ما، مايكروسوفت هي طرق طويلة من المطابقة لمعيار C99، حتى على الامور سهلة مثل <stdint.h>. لحسن الحظ، يحافظ على المشروع VC ++ نسخة stdint .

أتوقع أن لديك 0x7f80.أعتقد أنك قصدت أن الكتابة هي:

unsigned short int c = b<<7; // c should == 0x80

ومما يؤسف له، VC ++ (وC مترجم) لم يقم inttypes.h لأنه لا يعتمد بشكل كامل C99. لديك لاستخدام رؤوس-3rd الطرف (مثل بول هسيه stdint.h).

إذا كنت ترغب في الحصول على تلك النتيجة، يمكنك بقطع جزء a << 7 أكبر من 8TH-الأقل كبير بت، وذلك باستخدام أحادي المعامل و:

unsigned short int c = (a << 7) & 0xff;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top