鱼C论坛

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

符号数于int ,char 的关系?

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


运行结果

运行结果

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

最佳答案

查看完整内容

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

使用道具 举报

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

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

这里的函数PrintComplate是个通用的模板函数, 可以打印变量在内存中的补码
无论是char 还是int, 即无论啥类型 都能自动识别

  1. template<typename T>
  2. void PrintComplement(T num)
  3. {
  4.         for (int i = sizeof(T)*8 - 1; i >= 0; i--)
  5.                 printf("%d", (num >> i) & 0x01);
  6. }

  7. int main(void)
  8. {
  9.         signed int sINT=0XFF;
  10.         unsigned int unINT=0XFF;
  11.         signed char sCHAR=0XFF;
  12.         unsigned char unCHAR=0XFF;
  13.         printf("[255]=0XFF=1111 1111 ;\n");
  14.         printf("signed with int :%d ,unsigned with int :%d ;\n",sINT,unINT);
  15.         printf("signed with char:%d ,unsigned with char:%d ;\n",sCHAR,unCHAR);
  16. // ------------------------------------------------------------------- //

  17.         printf("sINT is :\n");       
  18.         PrintComplement(sINT);
  19.         printf("\n");

  20.         printf("sCHAR is : \n");
  21.         PrintComplement(sCHAR);
  22.         printf("\n");

  23.         return 0;
  24. }
复制代码


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 多谢

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

NB
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

大神,谢谢啊,我要向你学习了。达到这种程度。看的书会很多吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

恩恩,谢谢啊,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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