i do not understand how unsigned chars work
in the code
Code:
#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
saved_char behaves funny when declared as signed char
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.