鱼C论坛

 找回密码
 立即注册
查看: 1911|回复: 5

符号数于int ,char 的关系?

[复制链接]
发表于 2015-7-23 18:06:28 | 显示全部楼层 |阅读模式
5鱼币
插入代码:(问题在注释里面)
#include<stdio.h>
int main(void){
        signed int sINT=0XFF;
        unsigned int unINT=0XFF;
        signed char sCHAR=0XFF;
        unsigned char unCHAR=0XFF;
        printf("[255]=0XFF=1111 1111 ;\n");
        printf("signed with int :%d ,unsigned with int :%d ;\n",sINT,unINT);
        printf("signed with char:%d ,unsigned with char:%d ;\n",sCHAR,unCHAR);
        return 0;
}
/*在这里我有signed unsigned的int和char:
 *问题:为什么signed char 打印的是-1,而signed int 则不是? 
 */

运行结果

运行结果

时间:2013年7月23日18:06:30;

最佳答案

查看完整内容

额 楼主 好巧啊 又遇到你了 直接上代码 这里的函数PrintComplate是个通用的模板函数, 可以打印变量在内存中的补码 无论是char 还是int, 即无论啥类型 都能自动识别 首先可以看到 无论是int 还是char FF都被赋值给了最低的8位 但是对于char 8位中就包含了符号位 因为char 本来就8位 但对于int来说 值赋值给了32位中的低八位 楼主可以看到int的最高位是0 而非1 即符号位是正而非负 如果要想变为负数 可以考 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-23 18:06:29 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-7-24 12:40 编辑

额 楼主 好巧啊 又遇到你了
直接上代码

这里的函数PrintComplate是个通用的模板函数, 可以打印变量在内存中的补码
无论是char 还是int, 即无论啥类型 都能自动识别
template<typename T>
void PrintComplement(T num)
{
        for (int i = sizeof(T)*8 - 1; i >= 0; i--)
                printf("%d", (num >> i) & 0x01);
}

int main(void)
{
        signed int sINT=0XFF;
        unsigned int unINT=0XFF;
        signed char sCHAR=0XFF;
        unsigned char unCHAR=0XFF;
        printf("[255]=0XFF=1111 1111 ;\n");
        printf("signed with int :%d ,unsigned with int :%d ;\n",sINT,unINT);
        printf("signed with char:%d ,unsigned with char:%d ;\n",sCHAR,unCHAR);
// ------------------------------------------------------------------- //

        printf("sINT is :\n");        
        PrintComplement(sINT);
        printf("\n");

        printf("sCHAR is : \n");
        PrintComplement(sCHAR);
        printf("\n");

        return 0;
}

1.jpg
首先可以看到 无论是int 还是char FF都被赋值给了最低的8位
但是对于char 8位中就包含了符号位 因为char 本来就8位
但对于int来说 值赋值给了32位中的低八位

楼主可以看到int的最高位是0 而非1
即符号位是正而非负

如果要想变为负数
可以考虑
sINT |= 0xF1234567;
反正只要把最高位变为1即可, 即F那位

如果单纯的想变为负数, 在不使用-号的情况下
直接 sInt = (~sINt) + 1
得-255

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
lark + 1 + 1 多谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-24 09:57:48 | 显示全部楼层
因为char占一个字节的大小,而int是4个字节,你只是赋了一个字长的大小,所以char 是-1,而int 是255,你可以查看内存。一下就明白了。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
lark + 1 + 1 谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-25 16:52:03 | 显示全部楼层
ryxcaixia 发表于 2015-7-24 10:33
额 楼主 好巧啊 又遇到你了
直接上代码

NB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-25 17:25:41 | 显示全部楼层
ryxcaixia 发表于 2015-7-24 10:33
额 楼主 好巧啊 又遇到你了
直接上代码

大神,谢谢啊,我要向你学习了。达到这种程度。看的书会很多吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-25 17:29:28 | 显示全部楼层
yjip267 发表于 2015-7-24 09:57
因为char占一个字节的大小,而int是4个字节,你只是赋了一个字长的大小,所以char 是-1,而int 是255,你可 ...

恩恩,谢谢啊,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 05:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表