兴海北路

---男儿仗剑自横行
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

  • 随笔 - 85
  • 文章 - 0
  • 评论 - 17
  • 引用 - 0

常用链接

留言簿(6)

随笔分类

随笔档案

收藏夹

全是知识啊

搜索

  •  

最新评论

阅读排行榜

评论排行榜

(转载)char与unsigned char的本质区别

原文地址:http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html

      在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed)char与unsigned char之间的区别。

      首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示的范围是-128~127,unsigned char没有符号位,因此能表示的范围是0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。

      在实际使用过程中有什么区别呢?

      主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

      但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?

      首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。

      如果是char,那么系统认为最高位是符号位,而int可能是16位或者32位,那么系统会对最高位做扩展(注意,赋给unsigned int也会做扩展),而如果是unsigned char,那么系统不会做扩展。

      这就是二者的最大区别。

      同理可以推导到其他的类型,比如short,unsigned short,等等。

      具体可以通过下面的小例子看看其区别:

      

#include<stdio.h>

void f(unsigned char v)
{
    
char c = v;
    unsigned 
char uc = v;
    unsigned 
int a = c, b = uc;
    
int i = c, j = uc;
    printf(
"------------------------\n");
    printf(
"%%c: %c, %c\n", c, uc);
    printf(
"%%X: %X, %X\n", c, uc);
    printf(
"%%u: %u, %u\n", a, b);
    printf(
"%%d: %d, %d\n", i, j);
}


int main(int argc, char *argv[])
{
    f(
0x80);
    f(
0x7F);
    
return 0;
}

      输出结果:

------------------------
%c: €, €
%X: FFFFFF80, 80
%u: 4294967168128
%d: -128128
------------------------
%c: , 
%X: 7F, 7F
%u: 127127
%d: 127127
请按任意键继续. . .


      由此可见,最高位若为0时,二者没有区别;若为非0时,则有区别了。



posted @ 2015-01-07 11:52 随意门| 编辑 收藏
C语言:getopt_long()函数的作用

     摘要:     Linux系统下,需要大量的命令行选项,如果自己手动解析他们的话实在是有违软件复用的思想,不过还好,GNU C library留给我们一个解析命令行的接口(X/Open规范),好好使用它可以使你的程序改观不少。    使用getopt_long()需要引入头文件:#include<getopt.h> &nbs...  阅读全文

posted @ 2010-06-13 15:32 随意门 阅读(7875) | 评论 (0)编辑 收藏
10个评委打分,去掉一个最高分,去掉一个最低分,求平均分,并对评委进行评判

对评委进行评判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委。我实现的代码如下面所示,请大家给予点评,我接触C语言很长时间了,但是掌握的很不好,这次想多写点程序,来提高水平 ,希望各位多给点指导,谢谢大家!

 1#include <iostream>
 2#include <cmath>
 3using namespace std;
 4
 5int main()
 6{
 7// max:保存最高分;min:保存最低分;sum:保存总分;avg:保存平均分
 8    int i, max, min, sum, avg;
 9    max = -32768;
10    min = 32767;
11    sum = 0;
12    int p[10];
13
14// 将评委的打分存在数组p中,求出平均分
15    for (i = 1; i <= 10; i++)
16    {
17        cout << "Input number " << i << "";
18        cin >> p[i - 1];
19
20        if (p[i - 1> max)
21        {
22            max = p[i - 1];
23        }

24        if (p[i - 1< min)
25        {
26            min = p[i - 1];
27        }

28        sum += p[i - 1];
29    }

30
31    cout << "Canceled max score:" << max 
32        << " Canceled min score:" << min << endl;
33
34    cout << "Average score:" << (avg = (sum - max - min)/8<< endl;
35
36// 比较每个评委打分同平均值的绝对值,求出差距最大和最小的评委
37    max = -32768;
38    min = 32767;
39    int badguy = -1;
40    int goodguy = -1;
41
42    for (i = 0; i < 10; i++)
43    {
44        if (abs(p[i]-avg) > max)
45        {
46            max = p[i] - avg;
47            badguy = i + 1;
48        }

49    }

50    for (i = 0; i < 10; i++)
51    {
52        if (abs(p[i] - avg) < min)
53        {
54            min = p[i] - avg;
55            goodguy = i + 1;
56        }

57    }

58
59    cout << "goodguy is " << goodguy << endl;
60    cout << "badguy is "  << badguy << endl;
61
62    return 0;
63}

posted @ 2010-05-26 17:16 随意门 阅读(8144) | 评论 (2)编辑 收藏
实现函数y=x*x的图形与圆的图形叠加显示

 1/************************************************************************
 2    与sin(x)和cos(x)叠加显示是一个思路,没有考虑算法的时间复杂度;
 3    打印圆时利用图形的左右对称性。根据圆的方程:
 4                R*R = X*X + Y*Y
 5    可以计算出圆上每一点行和列的关系。
 6************************************************************************/

 7#include <iostream>
 8#include <cmath>
 9using namespace std;
10
11int main()
12{
13    double y;
14    int x, m, n;
15
16    for (y = 10; y >= -10; y--)
17    {
18        m = 1.9*sqrt(100 - y*y);
19        n = 1.9*sqrt(y);
20        
21        for (x = 1; x <= 30; x++)
22        {
23            if (x == n && x == m)
24            {
25                cout << "+";
26            }

27            else if (x == 30 - m)
28            {
29                cout << "+";
30            }

31            else if (x == 30 - n)
32            {
33                cout << "*";
34            }

35            else
36                cout << " ";
37        }

38
39        for (; x <= 60; x++)
40        {
41            if (x == n && x == m)
42            {
43                cout << "+";
44            }

45            else if (x == 30 + m)
46            {
47                cout << "+";
48            }

49            else if (x == 30 + n)
50            {
51                cout << "*";
52            }

53            else
54                cout << " ";
55        }

56        cout << endl;
57    }

58
59    return 0;
60}

posted @ 2010-05-26 14:57 随意门 阅读(717) | 评论 (1)编辑 收藏
实现0~360度sin(x)曲线与cos(x)曲线图形的同时显示

 c语言趣味编程百例精解中的习题,参考了该书中的头两个例子:假定图形的总宽度为62列,cos(x)曲线用"+"表示,sin(x)曲线用"*"表示。

 1#include <iostream>
 2#include <cmath>
 3using namespace std;
 4
 5int main()
 6{
 7    double y;
 8    int m, n, x, yy;
 9
10    for (yy = 0; yy <= 20; yy++)
11    {
12        y = yy * 0.1;
13        m = acos(1 - y)*10;    /* m:cos(x)曲线上y点对应的坐标列 */
14        n = asin(1 - y)*10/* n:sin(x)曲线上y点对应的坐标列 */
15
16        for (x = 0; x <= 31; x++/* 0~180度的图像显示 */
17        {
18            if (x == n && x == m)    /* 相交时打印'+' */
19            {
20                cout << "+";
21            }

22            else if (x == m || x == 62 - m)  /* 打印不相交时的cos(x)曲线图形 */
23            {
24                cout << "+";
25            }

26            else if (x == n || x == 31 - n ) /* 打印不相交时的sin(x)曲线图形 */
27            {
28                cout << "*";
29            }

30            else
31                cout << " ";                /* 其他情况打印空格 */
32        }

33        for (; x <= 62; x++/* 180~360度的图像显示 */
34        {
35            if (x == n && x == m)
36            {
37                cout << "+";
38            }

39            else if (x == m || x == 62 - m)
40            {
41                cout << "+";
42            }

43            else if (x == 31 - n || x == 62 + n)
44            {
45                cout << "*";
46            }

47            else
48                cout << " ";
49        }

50        cout << endl;
51    }

52}

posted @ 2010-05-26 13:55 随意门 阅读(1040) | 评论 (0)编辑 收藏
Linux makefile 教程 非常详细,且易懂

     摘要: 最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。             于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。      ...  阅读全文

posted @ 2010-01-04 11:09 随意门 阅读(1096) | 评论 (0)编辑 收藏
代码覆盖率的测试工具 -- gcov

     摘要: 代码覆盖率的测试工具 -- gcov 2009-03-25 09:47 简介在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们将探讨当执行保险测试...  阅读全文

posted @ 2010-01-03 12:03 随意门 阅读(2527) | 评论 (0)编辑 收藏
(转)用NET-SNMP软件包开发简单客户端代理

     摘要: 写在前面的话:对于net-snmp我也是一个初学者,开始学习时也碰到了很多低级的问题。在很多论坛上(事实上比较少^_^, 建议大家直接去sourcefoge社区看关于net-snmp的mail-list),都没有比较初级入门的文章,本着开源学习的精神,把自己的一点收获,共享给大家。通过参考一些前辈的文章和帮助文档,本文实现了一个简单的mib,并编写了文档。本文主要面向初级学习者(我也是个...  阅读全文

posted @ 2009-03-05 15:28 随意门 阅读(7814) | 评论 (2)编辑 收藏
(转)net-snmp服务的安装

今天做了snmp的测试,现把安装配置方法分享如下:
   首先准备安装的源码包:net-snmp-5.4.2.1.tar.gz
1.解压源码包
  tar xvf net-snmp****
2.创建安装目录
  mkdir /usr/local/net-snmp
3.安装
  ./configure --prefix=/usr/local/net-snmp
  make
  make install
4.安装成功cp配置文件到/usr/local/net-snmp/share/snmp/目录下
  cp ./EXZAPLE.conf /usr/local/net-snmp/share/snmp/snmpd.conf
5.修改配置文件
  #       sec.name  source          community
  #com2sec local     localhost       COMMUNITY
  #com2sec mynetwork NETWORK/24      COMMUNITY
  com2sec local     localhost       COMMUNITY
  com2sec mynetwork 192.168.1.186      public      //为允许的源地址
  com2sec mynetwork 192.168.1.254      public
  com2sec mynetwork 192.168.1.0/24      public     //为允许的源网络
6.编辑/etc/rc.local添加为自启动  
  添加下面一行:
  /usr/local/net-snmp/sbin/snmpd -c /usr/local/net-snmp/share/snmp/snmpd.conf &
7.设置环境变量,编辑/etc/profile
  在export前添加下面一行
  PATH=/usr/local/net-snmp/bin:/usr/local/net-snmp/sbin:$PATH
8.测试命令
  snmpget -v 1 -c "public" 192.168.1.236 .1.3.6.1.4.1.2021.10.1.3.1
  注:要在同样安装过net-snmp的机器上测或在安装过第3方软件(solarwinds等)的机器测试
      该命令的最后一个字段为cpu的OID  
 
#########################################################################
问题补充:
       上次装好netsnmp并观察了一段时间后发现获取内存,cpu信息等等都很正常,唯独磁盘信息与预期有点出入,我们预期获取磁盘所有分区的使用情况结果只获取了/根分区的使用情况:
       经查证是配置文件snmpd.conf里的配置有关:
# disk checks
#
# The agent can check the amount of available disk space, and make
# sure it is above a set limit.
# disk PATH [MIN=DEFDISKMINIMUMSPACE]
#
# PATH:  mount path to the disk in question.
# MIN:   Disks with space below this value will have the Mib's errorFlag set.
#        Default value = DEFDISKMINIMUMSPACE.
# Check the / partition and make sure it contains at least 10 megs.
disk / 10000
disk /home 10000
# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.9
# enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F
# enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0"
# enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000
# enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130
# enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325
# enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092
# enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58
# enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = ""
因为配置文件默认只有disk / 10000这一行;按此格式添加你期望获取的磁盘或分区;
it‘s ok!!问题解决;
验证cmd:
snmpwalk -v 1 -c "public" 218.108.231.183 .1.3.6.1.4.1.2021.9.1
snmpwalk -v 1 -c "public" 218.108.231.183 .1.3.6.1.4.1.2021.9.1.7
 

posted @ 2009-03-05 13:55 随意门 阅读(710) | 评论 (0)编辑 收藏
(转)net-snmp安装手记

Installing /usr/share/man/man3/NetSNMP::agent.3pm
Installing /usr/share/man/man3/NetSNMP::OID.3pm
Installing /usr/share/man/man3/NetSNMP::agent::default_store.3pm
Installing /usr/share/man/man3/SNMP.3
Installing /usr/share/man/man3/NetSNMP::netsnmp_request_infoPtr.3pm
Installing /usr/share/man/man3/NetSNMP::default_store.3pm
Installing /usr/share/man/man3/NetSNMP::ASN.3pm
Installing /usr/share/man/man3/NetSNMP::TrapReceiver.3pm
Writing /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/Bundle/NetSNMP/.packlist
Appending installation info to /usr/lib/perl5/5.8.5/i386-linux-thread-multi/perllocal.pod
make[1]: Leaving directory `/root/net-snmp-5.4.1/perl'




[root@cgeek ~]# rpm -vih elfutils-devel-0.96-1.i386.rpm
warning: elfutils-devel-0.96-1.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
error: Failed dependencies:
        elfutils-libelf-devel = 0.96-1 is needed by elfutils-devel-0.96-1.i386
[root@cgeek ~]# rpm -qa |grep elfutils
elfutils-libelf-0.96-1
elfutils-0.96-1
[root@cgeek ~]# rpm -vih elfutils-libelf-devel-0.96-1.i386.rpm
warning: elfutils-libelf-devel-0.96-1.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing...                ########################################### [100%]
   1:elfutils-libelf-devel ########################################### [100%]
[root@cgeek ~]# rpm -vih elfutils-devel-0.96-1.i386.rpm
warning: elfutils-devel-0.96-1.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing...                ########################################### [100%]
   1:elfutils-devel         ########################################### [100%]



[root@cgeek ~]# /etc/rc.d/init.d/snmpd start
启动 snmpd:                                               [ 确定 ]



http://blog.chinaunix.net/u2/62377/showart_490549.html

一.环境
OS:RHEL AS4
net-snmp version:5.3.2
二.步骤
1.用root帐户登录
2.运行snmpwalk和snmpget命令,看是否已经安装snmp,如果已经安装就没必要再安装了;-)
3.将net-snmp-5.3.2.tar.gz解压(tar -zxvf net-snmp-5.3.2.tar.gz)
4.进入net-snmp-5.3.2目录
5.运行./configure,根据提示输入相应信息
6.运行make
7.运行make install
8.安装完毕
三.可能遇到的问题
1.找不到libbeecrypt.la,在make时可能出现如下error

libtool: link: cannot find the library `/usr/lib/libbeecrypt.la' (librpmio.la: /usr/lib/libbeecrypt.la)

make[1]: *** [snmpd] Error 1

make[1]: Leaving directory `/home/xxx/net-snmp-5.3.2/agent'

make: *** [subdirs] Error 1

解决办法:
http://sourceforge.net/projects/beecrypt下载beecrypt-4.1.2.tar.gz
然后运行如下命令:
#tar -zxvf beecrypt-4.1.2.tar.gz
#./configure -prefix=/usr(默认是安装在/usr/local,我们需要安装在/usr目录下)
#make
#make install
2./usr/bin/ld: cannot find -lelf,在make时可能出现如下error

/usr/bin/ld: cannot find -lelf

collect2: ld returned 1 exit status

make[1]: *** [snmpd] Error 1

make[1]: Leaving directory `/home/xxx/net-snmp-5.3.2/agent'

make: *** [subdirs] Error 1

解决办法:
#ln -s libelf.so.1 /usr/lib/libelf.so
3.我在安装的过程中没有碰到这个问题,在此作为参考
echo /usr/local/lib >/etc/ld.so.conf.d/libnetsnmp.conf
#/sbin/ldconfig -v
#make install

posted @ 2009-03-05 11:30 随意门 阅读(715) | 评论 (0)编辑 收藏
仅列出标题
共9页: 1 2 3 4 5 6 7 8 9