verdadero tipos resueltos relativo que porcentual numericos metodos indica errores error ejercicios absoluto c++ math bit-shift

c++ - tipos - Shift count error negativo o demasiado grande-¿solución correcta?



tipos de errores metodos numericos pdf (2)

Tu forma de eliminar la advertencia es correcta. Como probablemente ya sepa, la advertencia se produce porque está tratando de desplazar el contenido de un byte más allá de los límites de una palabra, y luego lo almacena en la palabra quad. Esta operación no está definida. (Evaluará el lado derecho de la tarea antes de asignar el valor.) Al emitir explícitamente primero, ahora hay suficiente espacio para hacer el cambio, por lo que no hay nada de qué quejarse.

Podría decirse que el compilador debería ser capaz de descubrir que lo va a almacenar en el quadword, por lo que debe asignar primero un quadword y hacer el cambio allí, pero puede que no se haya hecho lo suficientemente inteligente como para resolverlo.

Además, no estoy seguro de esto, pero posiblemente compilar esto para x64 tampoco generará la advertencia, ya que una palabra es de 64 bits.

Tengo la siguiente función para leer una quadword big-endian (en una clase de E / S de archivo base abstracta):

unsigned long long File::readBigEndQuadWord(){ unsigned long long qT = 0; qT |= readb() << 56; qT |= readb() << 48; qT |= readb() << 40; qT |= readb() << 32; qT |= readb() << 24; qT |= readb() << 16; qT |= readb() << 8; qT |= readb() << 0; return qT; }

Las funciones readb () leen un BYTE. Aquí están los typedefs usados:

typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD;

Lo que pasa es que recibo 4 advertencias de compilador en las primeras cuatro líneas con la operación de cambio:

advertencia C4293: ''<<'': cuenta de turno comportamiento negativo o demasiado grande, indefinido

Entiendo por qué ocurre esta advertencia, pero parece que no puedo entender cómo deshacerme de ella correctamente . Podría hacer algo como:

qT |= (unsigned long long)readb() << 56 ;

Esto elimina la advertencia, pero ¿no hay otro problema? ¿El BYTE se extenderá correctamente todo el tiempo? Tal vez solo estoy pensando demasiado y la solución es así de simple. ¿Pueden ayudarme aquí? Gracias.


qT | = (unsigned long long) readb () << (shiftvalue & 63); Esta será la solución perfecta, suponiendo que no requieras más de 63 bits de turno