i do not understand how unsigned chars work
in the code
saved_char behaves funny when declared as signed charCode:#include <stdio.h> int main(int argc,char **argv) { char input_char; char saved_char; int i,rotate,temp; int input_array[8]; int rotate_array[8]; printf("What is the input character?"); scanf("%c",&input_char); saved_char=input_char; for(i=0;i<8;i++) { if((input_char&1)==1) input_array[i]=1; else input_array[i]=0; input_char>>=1; } printf("\n\nArray is\n"); for(i=7;i>-1;i--) printf("%d",input_array[i]); printf("how many bits rotation"); scanf("%d",&rotate); for(i=0;i<rotate;i++) { if((saved_char&1)==1) temp=1; else temp=0; saved_char>>=1; if(temp==1) saved_char|=0x080; else {} } for(i=0;i<8;i++) { if((saved_char&1)==1) rotate_array[i]=1; else rotate_array[i]=0; saved_char>>=1; } printf("\nAfter rotation\n\n"); for(i=7;i>-1;i--) { printf("%d",rotate_array[i]); } getch(); return 0; } #if 0 #define FALSE 0 #define NULL 0 typedef struct { int dataitem; struct listelement *link; } listelement; void Menu (int *choice); listelement * AddItem (listelement * listpointer, int data); listelement * RemoveItem (listelement * listpointer); void PrintQueue (listelement * listpointer); void ClearQueue (listelement * listpointer); int main(void) { listelement listmember, *listpointer; int data,choice; int i,number_of_data; listelement *lp_temp; listpointer=NULL; printf("How many numbers are required?"); scanf("%d",&number_of_data); data=0; for(i=0;i<number_of_data;i++) { listpointer = AddItem(listpointer,data); } lp_temp=listpointer; while(listpointer != NULL) { printf("What is the data item to be added "); scanf("%d",&data); listpointer->dataitem=data; listpointer=listpointer->link; } listpointer=lp_temp; PrintQueue(listpointer); getch(); #if 0 do{ Menu (&choice); switch(choice) { case 1: printf("What is the data item to be added "); scanf("%d", &data); listpointer = AddItem(listpointer,data); break; case 2: if (listpointer == NULL) printf("Queue is empty"); else listpointer=RemoveItem (listpointer); break; case 3: PrintQueue(listpointer); break; case 4: break; default: break; }//end switch(choice) } while(choice !=4); ClearQueue(listpointer); #endif return 0; } void Menu (int *choice) { char local; printf ("\nEnter\t1 to add item,\n\t2 to remove item\n\t3 to print queue\n\t4 to quit\n"); do { local =getchar (); if ((isdigit (local) == FALSE) && (local != '\n')) { printf ( "\nYou must enter an integer(1-4)\n"); } }while (isdigit ((unsigned char) local) == FALSE); *choice = (int) local - '0'; } listelement* AddItem (listelement * listpointer, int data) { listelement *lp=listpointer; if(listpointer != NULL) { while(listpointer ->link!= NULL) listpointer=listpointer->link; listpointer ->link=(struct listelement *)malloc(sizeof (listelement)); listpointer=listpointer->link; listpointer->link= NULL; listpointer->dataitem=data; return lp; } else { listpointer =(struct listelement *)malloc(sizeof (listelement)); listpointer->link=NULL; listpointer->dataitem=data; return listpointer; } } listelement* RemoveItem (listelement * listpointer) { listelement *tempp; printf("Element removed is %d\n", listpointer->dataitem); tempp=listpointer->link; free(listpointer); return tempp; } void PrintQueue (listelement * listpointer) { if(listpointer == NULL) printf("queue is empty"); else while( listpointer != NULL) { printf("%d\t",listpointer->dataitem); listpointer=listpointer->link; } printf("\n"); } void ClearQueue (listelement *listpointer) { while(listpointer != NULL) listpointer = RemoveItem (listpointer); } #endif
in the line
saved_char|=0x080;
say if we have 'a' which is 97, the first right shift moves it to 48, but when i bitwise OR it with 1, i get -80 instead of -48 as i had assumed.
with unsigned it works perfectly, it comes up with 176.



LinkBack URL
About LinkBacks



[/edit]