ptw@vaxine.UUCP (P. Tucker Withington) (07/11/83)
Speaking of type casts, can anyone explain the following?
char c;
int *pi;
main()
{
c = *((char *) pi);
c = (char) *pi;
On 4.1 generates:
movb *_pi,_c
cvtbl *_pi,r0 ; Huh?
cvtlb r0,_c
With MIT cc generates:
movl pi,a0
movb a0@,c
movl pi,a0
movl a0@,d0 | Looks better
movb d0,c
Is that the reason for:
/* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
case 'c':
b = *adx;
for (i = 24; i >= 0; i -= 8)
if (c = (b >> i) & 0x7f)
putchar(c, touser);
break;
?
--Tucker (ptw@vaxine.UUCP)ka@spanky.UUCP (07/13/83)
Re:
int *pi;
char c;
c = *pi;
compiling to:
cvtbl *_pi,r0 ; Huh?
cvtlb r0,_c
The code generated by the C compiler is correct. It is also inefficient;
"movb *_p1,_c" would be better. Probably that perticular statement
does not occur too often, so the deficiency in the C compiler is not too
serious.
The code reproduced from printf was designed to handle multiple chacter
constants. E. g.
printf("%c\n", 'ab');
should produce:
ab
Kenneth Almquist