免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3008 | 回复: 5

看《c与指针》的疑问 [复制链接]

论坛徽章:
0
发表于 2007-11-10 14:08 |显示全部楼层
我在学习中遇到的问题。

1.在你的机器上字符的范围有多大?

有一种做法是
  1. printf("signed char min =%d\n",  -(char)((unsigned char)~0>>1));
  2. printf("signed char max =%d\n", (char)((unsigned char)~0>>1));
复制代码

但没有明白这样做的意思。

2.在你的机器上,各种不同类型的浮点数的范围是怎样的?
用float.h里定义的宏FLT_MIN,FLT_MAX,DBL_MIN,DBL_MAX,LDBL_MIN,LDBL_MAX行吗?如果不行,用什么方法?

3如果整数类型在正常情况下是有符号的,那么signed 关键字的作用何在?

4.你认为位操作符和移位操作符可以用在什么地方?

5假定一个整数的值是244.为什么机器不会把这个值解释为一个内存地址呢?
是因为编译器没有这样的指令吧。

大家回答一下。谢谢。

论坛徽章:
0
发表于 2007-11-10 14:52 |显示全部楼层
大家帮帮我啊,解释一下啊。问题积累了,解决不了,心里不爽。虽然本人比较菜,但是俺不放弃。学习去了。回来在看。

论坛徽章:
0
发表于 2007-11-10 17:34 |显示全部楼层

回复 #1 meiyuhan 的帖子

我在学习中遇到的问题。

1.在你的机器上字符的范围有多大?

有一种做法是

[Copy to clipboard] [ - ]CODE:
printf("signed char min =%d\n",  -(char)((unsigned char)~0>>1));
printf("signed char max =%d\n", (char)((unsigned char)~0>>1));
但没有明白这样做的意思。
=====================================
最高位是符号位,0的反码是全F(0xFF),除去最高位就是最大的字符:(char)((unsigned char)~0>>1));
我觉得最小值不对。应该是还要减1


2.在你的机器上,各种不同类型的浮点数的范围是怎样的?
用float.h里定义的宏FLT_MIN,FLT_MAX,DBL_MIN,DBL_MAX,LDBL_MIN,LDBL_MAX行吗?如果不行,用什么方法?
================================================
移植性问题

3如果整数类型在正常情况下是有符号的,那么signed 关键字的作用何在?
========================
你在强制转换的时候怎么办?

4.你认为位操作符和移位操作符可以用在什么地方?
====================
很多地方,比如操作寄存器的某些位,而不允许改变其他位

5假定一个整数的值是244.为什么机器不会把这个值解释为一个内存地址呢?
==============================
看你怎么用了,如果我愿意,我完全可以把它当作地址*(int *)244
是因为编译器没有这样的指令吧。

大家回答一下。谢谢。

论坛徽章:
0
发表于 2007-11-10 22:29 |显示全部楼层
楼上的,好人啊。眼泪哇哇的。

论坛徽章:
0
发表于 2007-11-11 12:59 |显示全部楼层
1. 获取最小值的方法是错误的。

对于有符号整数(包括字符类型)的负数的实现,通常有两种补码方案:1的补码和2的补码。这两种补码会导致一种有符号整数类型的最小值(是一个负数)不同——最小值之间相差1。一个编译器的实现会从这两种补码方案中选择一种。因此,这不是一个“计算”可以解决的问题。

2. 不知道除了这样还能有什么通用的方法。

3. int 其实是 signed int,long int 其实是 signed long int,……,但是有唯一的例外:char != signed char,因为 char 是实现相关的:可能是 unsigned char,可能是 signed char。对于 signed char 类型,signed 的存在就是必须的。

4. 对整数(特别是无符号整数)左移或右移 N 位相当于乘以或除以 2 的 N 次幂,所以可以用来进行有限的数值计算。

在实际中,人们经常把一组信息同时放在一个整数中以节省空间。移位和位操作更为常用的是用来设置和提取整数中存放的信息。

5. 在 C 语言中,一个值解释为什么取决于它的类型,而 244 是一个整数类型,不是指针类型,所以这个值不是一个地址值。如果想把它作为一个地址值使用,需要强制转换为指针。

论坛徽章:
0
发表于 2007-11-11 13:24 |显示全部楼层
很全面,很专业。很透彻。很感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP