غير متوقع bitshift النتائج
سؤال
انا تهيئة غير موقعة قصيرة الباحث مع أ = 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;