Hier ist ein Code in C++:Zeichen aus einer variablen Bit erstreckende Breite
#include <iostream>
#include<limits.h>
using namespace std;
void sign_extending(int x,unsigned b)
{
int r; // resulting sign-extended number
int const m = CHAR_BIT * sizeof(x) - b;
r = (x << m) >> m;
cout << r;
}
void Run()
{
unsigned b = 5; // number of bits representing the number in x
int x = 29; // sign extend this b-bit number to r
sign_extending(x,b);
}
Ergebnis: -3
Die resultierende Zahl wird eine vorzeichenbehaftete Zahl mit seiner Anzahl von Bits gespeichert werden, in b. Ich versuche, diesen Code in Python zu replizieren:
from ctypes import *
import os
def sign_extending(x, b):
m = c_int(os.sysconf('SC_CHAR_BIT') * sizeof(c_int(x)) - b)
r = c_int((x << m.value) >> m.value) # Resulting sign-extended number
return r.value
b = c_int(5) # number of bits representing the number in x
x = c_int(29) # sign extend this b-bit number to r
r = sign_extending(x.value, b.value)
print r
Ergebnis: 29
ich nicht das Zeichen erweiterte Zahl wie von der Ausgabe in C++ bekommen. Ich möchte den Fehler oder Probleme in meinem aktuellen Code (Python) und auch eine mögliche Lösung für das Problem mit dieser Technik kennen.
verwenden, was Sie tun erstreckt Anmelde nicht. In C++ wird diese Erweiterung bereits für Sie signiert, wenn Sie Ganzzahlen mit Vorzeichen verwenden. –
Diese Frage ist _extremely_ ähnlich der, die Sie gestern gefragt haben: http://stackoverflow.com/questions/38794715/bit-field-specialization-in-python –
Auch in C und C++, Verschieben einer negativen Zahl rechts ist [nicht garantiert das Vorzeichenbit zu replizieren] (http://stackoverflow.com/questions/6487918/signed-right-shift-which-compiler-use-logical-shift). –