鱼C论坛

 找回密码
 立即注册
查看: 2617|回复: 4

关于unsigned用法

[复制链接]
发表于 2015-10-25 23:32:57 | 显示全部楼层 |阅读模式
1鱼币
unsigned int b;
  b=-10;
  printf("%d",b)此程序运行后输出为-10,但unsigned是无符号型,为何结果还有负号?

最佳答案

查看完整内容

1. 你用int定义也好, unsigned定义也好, -10这个字面值整形常量内存中就是0xFFFFFFF6, 至于为啥学过计算机组成原理应该知道, 这个0xFFFFFFF6是-10的补码 补码在内存中的表现形式都是这样. 反汇编可以看到[ebp-4] [ebp-8]这俩就是这两个变量的地址 存的都是这货 所以 打印出来的肯定都是一样的-10 2. 你可以做个实现 int a = 97, printf("%c %d\n", a, a); 打印出来应该一个是字符a, 一个是整形97 编译器只会按照你告诉他的格 ...

点评

如果前面的回答中你觉得很满意了,那么请将你觉得不错的答案设置为最佳。  发表于 2015-10-27 13:17
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-25 23:32:58 | 显示全部楼层
1.png
1. 你用int定义也好, unsigned定义也好, -10这个字面值整形常量内存中就是0xFFFFFFF6, 至于为啥学过计算机组成原理应该知道, 这个0xFFFFFFF6是-10的补码 补码在内存中的表现形式都是这样. 反汇编可以看到[ebp-4] [ebp-8]这俩就是这两个变量的地址 存的都是这货 所以 打印出来的肯定都是一样的-10

2. 你可以做个实现 int a = 97, printf("%c %d\n", a, a); 打印出来应该一个是字符a, 一个是整形97
编译器只会按照你告诉他的格式去对内存中的那个数据举行格式化打印出来给你看, 并没有责任(也没有权利)对原始数据做任何修改
unsigned int a = -10并不会因为你定义了是unsigned类型 编译器强制去掉那个负号
相反 如果你真想看到编译器如何理解的unsigned
可以选择printf("%u\n", a);
这样编译器会把最高位不当成符号位而是当成2^31 加进去

评分

参与人数 1鱼币 +10 收起 理由
小甲鱼 + 10 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2015-10-26 10:33:07 | 显示全部楼层
ryxcaixia 发表于 2015-10-26 08:49
1. 你用int定义也好, unsigned定义也好, -10这个字面值整形常量内存中就是0xFFFFFFF6, 至于为啥学过计算 ...

那么 unsigned 存在的意义是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-26 11:19:25 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-10-26 11:20 编辑
y290176346 发表于 2015-10-26 10:33
那么 unsigned 存在的意义是什么


所有的数据都可以利用void*进行传递
在c和c++还存在着无所不用其极的强制类型转换 一个定义为unsigned类型的数组 可不可以转换为char* short* void*?
完全可以

类型的意义 一个是告诉编译器  将要按照某种类型 对内存的数据进行解释 int类型每次解释4个字节 short每次解释2个字节 unsigned 等忽略符号为 当成2^31的数字
我个人认为更多的是 只是加强代码的可读性 给人看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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