Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289535
  • 博文数量: 56
  • 博客积分: 3025
  • 博客等级: 中校
  • 技术积分: 534
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-06 17:28
个人简介

Honesty and diligence should be your eternal mates.

文章分类

全部博文(56)

文章存档

2012年(1)

2011年(27)

2010年(20)

2008年(8)

分类: LINUX

2011-09-20 20:11:21

今天写了一个转换点分十进制的IP地址为对应十六进制数的小程序,遇到下面的问题:
 35     h1 = (char)(ip_in_int->s_addr >> 24);
 36     h2 = (char)(ip_in_int->s_addr >> 16);
 37     h3 = (char)(ip_in_int->s_addr >> 8);
 38     h4 = (char)(ip_in_int->s_addr);
 39 
 40     printf("The hex form of the ip address is : 0x%02x%02x%02x%02x \n", h4, h3, h2, h1);
 
在解析255.255.255.255的时候,并不是输出0xffffffff,而是:0xffffffffffffffffffffffffffffffff;
看来,对于char型变量,如果值为全1,用上述方法打印时,宽度控制是不起作用的。解决方法如下:
#include
 35     h1 = (uint8_t)(ip_in_int->s_addr >> 24);
 36     h2 = (uint8_t)(ip_in_int->s_addr >> 16);
 37     h3 = (uint8_t)(ip_in_int->s_addr >> 8);
 38     h4 = (uint8_t)(ip_in_int->s_addr);
 39 
 40     printf("The hex form of the ip address is : 0x%02x%02x%02x%02x \n", h4, h3, h2, h1);
 41     return 0;

将char 型变量转化为uint8_t 就能正确的输出了。
阅读(3121) | 评论(5) | 转发(0) |
0

上一篇:内核新手区之源码编译

下一篇:亚马逊EBS

给主人留下些什么吧!~~

GFree_Wind2011-09-22 15:17:35

ws00871112: 非常感谢你的帮助。其实以前在《深入理解计算机系统》里也看到过改变整形值大小和类型的东西。在这儿只想着尝试用uint8_t来解决,并没有深入地去思考过这个问题.....
虚心使人进步。

对于奇怪的问题,一定要先想是自己代码的问题。

ws008711122011-09-22 14:59:57

billgate83: 什么平台下?.....
UBUNTU 11.04

ws008711122011-09-22 14:58:58

GFree_Wind: 你的理解有问题,我来告诉你原因:
1. 宽度控制是肯定起作用的。但是宽度控制是针对不足这个宽度会补齐,如果超过这个宽度,还是按照原始值打印;
2. 由第一点说.....
非常感谢你的帮助。其实以前在《深入理解计算机系统》里也看到过改变整形值大小和类型的东西。在这儿只想着尝试用uint8_t来解决,并没有深入地去思考过这个问题。Wind兄给的建议不错,这是学习态度的问题,接受批评,呵呵!

GFree_Wind2011-09-22 12:40:37

你的理解有问题,我来告诉你原因:
1. 宽度控制是肯定起作用的。但是宽度控制是针对不足这个宽度会补齐,如果超过这个宽度,还是按照原始值打印;
2. 由第一点说明,你应该知道你使用char时,对于printf来说其值为0xFFFFFFFF。原因是%x要求的是无符号整形变量,你传入的是char型,这里有一个整数提升的问题。char作为有符号数,提升到无符号整数,由于char的值为0xFF,那么提升时,前面的填充位为1。所以提升后其值为0xFFFFFFFF。
3. 你使用unint8_t时,是无符号提升,前面的填充为0,所以提升后的值为0xFF。

希望你仔细的研究后,再给出结论。对于C库来说,基本上不会有你可以发现的错误。最可能出问题的是你自己的代码。这样很容易误导别人。

最后如果想了解整数提升的问题,可以看我以前的文章

billgate832011-09-21 16:33:53

什么平台下?