int型赋给char型,按%u和%d输出结果的问题

图片说明
我看书上说,多字节赋值给低字节的,只将其低字节原封不地送到该变量。
可如图,我定义的char c,按%u输出的时候,变成4字节的了。

问题1,按%u和%d输出时,实质是转换成了无符号都int和有符号的int输出的,
所以我定义的char c,输出时候由1字节的char先变成4字节的int型,再按是否有符号输出。我这样说没错吧?
图片说明

问题2,虽然定义了 unsigned char c,当128赋值给c后,c的值在计算机中以1000 0000储存。为,而以%d输出时是正值,为什么?

第一个问题,注意,是多字节变成1个字节,而不是反过来,代码如下:

 #include <stdio.h>

int main () {
    int a = 0x12 * 256 + 0x34;
    printf("0x%x", (char)a);
    return 0;
}

结果

0x34

第二个,需要强制转换成有符号数

#include <stdio.h>

int main () {
    unsigned char a = 128;
    printf("%d", (char)a);
    return 0;
}

结果
-128

多字节变成1个字节,需要强制转换成有符号数