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输出时是正值,为什么?

2个回答

第一个问题,注意,是多字节变成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

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_43249053: 对
一年多之前 回复
weixin_43249053
weixin_43249053 回复caozhy: 定义为无符号类型的时候,位扩展按0补位吧?
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_43249053: 存储没有变
一年多之前 回复
weixin_43249053
weixin_43249053 那意思是c的值还是128,只是输出的时候%u%d是把值按照无符号,有符号的int形式输出的,c的值没变,输出形式变了而已。是这样吧
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_43249053: 之前说了,有符号的话,最高位如果是1,在前面扩展位都是1
一年多之前 回复
weixin_43249053
weixin_43249053 回复caozhy: 那为什么按%u输出的是111111111111111111111111 10000000(4294967168)
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_43249053: 不是哦
一年多之前 回复
weixin_43249053
weixin_43249053 问题1里先把4字节int转换成1字节的char,再按%d,%u输出时,这个结果是又由1字节变成了4字节int再输出的。是这样的吧?
一年多之前 回复
weixin_43249053
weixin_43249053 问题1,我用VS运行出来的结果是将10000000以符号位扩展到4个字节了的。按%u和%d输出时,实质是转换成了无符号都int和有符号的int输出的,
一年多之前 回复

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问