数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2564|回复: 21

[C51] 新手求助,函数名前面是unsigned int,这是什么意思?

[复制链接]
发表于 2022-1-16 19:47:55 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 广东梁百万 于 2022-1-16 19:50 编辑

最近学习CRC16校验,书中有例程,但书中没详细解释细节,
这个例程有下面这此需要求解答:

1 下面例程部分加红色语句    函数名前面是unsigned int,这是什么意思? 怎么不是 void

/* CRC16计算函数,ptr-数据指针,len-数据长度(字节),返回值-计算出的CRC16数值 */
unsigned int GetCRC16(unsigned char *ptr,  unsigned char len)
{
    unsigned int index;
    unsigned char crch = 0xFF;  //高CRC字节
    unsigned char crcl = 0xFF;  //低CRC字节
    unsigned char code TabH[] = {  //CRC高位字节值表
.............
............
...........

    while (len--)  //计算指定长度的CRC
    {
        index = crch ^ *ptr++;
        crch = crcl ^ TabH[index];
        crcl = TabL[index];
    }

    return ((crch<<8) | crcl);  
}

、、---------------------------------------------------


2  下面例程部分加红色语句   括号里同时出现指针buf  表达式  len-2   这又是什么意思? 是不是参数传递?

    //地址相符时,再对本帧数据进行校验
   // buf-接收到的命令帧指针,len-命令帧长度 */

    crc = GetCRC16(buf, len-2); //计算CRC校验值
    crch = crc >> 8;
    crcl = crc & 0xFF;
    if ((buf[len-2]!=crch) || (buf[len-1]!=crcl))
    {
        return;   //如CRC校验不符时直接退出
    }

发表于 2022-1-16 20:28:37 | 显示全部楼层
返回值是无符号整型
回复 支持 1 反对 0

使用道具 举报

发表于 2022-1-16 21:36:06 | 显示全部楼层
我个人的理解是
int 是 -32768 - 32767
unsigned int 就是Uint是0-65535
是无符号的意思,一般不用负数而且数据大的话用它就对了
回复 支持 反对

使用道具 举报

发表于 2022-1-16 21:50:05 | 显示全部楼层
unsigned int = uint = u16
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-16 22:14:56 | 显示全部楼层
yuingxin 发表于 2022-1-16 21:36
我个人的理解是
int 是 -32768 - 32767
unsigned int 就是Uint是0-65535

那 函数名前面加unsigned int是什么意思?
回复 支持 反对

使用道具 举报

发表于 2022-1-16 22:15:19 来自手机浏览器 | 显示全部楼层
本帖最后由 ploestar 于 2022-1-16 22:21 编辑

函数有返回值,前面加类型,否则void
函数调用带参数当然就是参数传递了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-16 22:15:43 | 显示全部楼层
40560335 发表于 2022-1-16 21:50
unsigned int = uint = u16

我知道unsigned int是数据类型
那 函数名前面加unsigned int是什么意思?
回复 支持 反对

使用道具 举报

发表于 2022-1-16 23:43:05 来自手机浏览器 | 显示全部楼层
这个,可以这样理解:有一个16位的数据存在24C01里,想读出来给一个叫“DATA16”的unsigned int,代码就可以写成:DATA16=这个奇怪的函数名;
回复 支持 反对

使用道具 举报

发表于 2022-1-17 02:42:29 | 显示全部楼层
void是没有返回值的函数,其它类型的函数是有返回值的函数。
对于keil c51而言,unsigned int类型的函数,返回值放在R6R7中,汇编代码大概是这样
  1. MOV R6,#12H
  2. MOV R7,#34H
  3. RET
复制代码
如果用一个unsigned int 变量保存返回值,如unsigned int a=函数名(),则a=0x1234。



回复 支持 反对

使用道具 举报

发表于 2022-1-17 10:18:16 | 显示全部楼层
个人觉得,对于C语言基础的问题,还是找个正儿八经的教程学个几个学时就掌握了,因为在论坛问的话,虽然大家技术可能很厉害,但回答基础问题不见得能很到位,而且大家七嘴八舌的,也不利于初学者掌握
回复 支持 2 反对 0

使用道具 举报

发表于 2022-1-17 10:54:39 | 显示全部楼层
南天音乐 发表于 2022-1-17 10:18
个人觉得,对于C语言基础的问题,还是找个正儿八经的教程学个几个学时就掌握了,因为在论坛问的话,虽然大 ...

非常同意。这是基础。
回复 支持 反对

使用道具 举报

发表于 2022-1-17 11:04:45 | 显示全部楼层
yuingxin 发表于 2022-1-16 21:36
我个人的理解是
int 是 -32768 - 32767
unsigned int 就是Uint是0-65535

现在很多平台,unsigned int 是4个字节,范围是0 - 4294967295
回复 支持 反对

使用道具 举报

发表于 2022-1-17 19:58:05 | 显示全部楼层
广东梁百万 发表于 2022-1-16 22:14
那 函数名前面加unsigned int是什么意思?

  unsigned int index;
    unsigned char crch = 0xFF;  //高CRC字节
    unsigned char crcl = 0xFF;  //低CRC字节
里面index crch crcl     为变量名
unsigned int GetCRC16是返回值是无符号int型的函数,要以return结尾返回值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-17 20:22:21 | 显示全部楼层
yuingxin 发表于 2022-1-17 19:58
unsigned int index;
    unsigned char crch = 0xFF;  //高CRC字节
    unsigned char crcl = 0xFF;   ...

谢谢,我试试把例程修改后下载到试验板上去验证下,看能不能领悟
回复 支持 反对

使用道具 举报

发表于 2022-1-18 09:10:29 | 显示全部楼层
广东梁百万 发表于 2022-1-16 22:15
我知道unsigned int是数据类型
那 函数名前面加unsigned int是什么意思?

表明函数返回的值是无符号整数类型。
回复 支持 反对

使用道具 举报

发表于 2022-1-18 20:55:52 | 显示全部楼层
个人理解,void函数不能有返回值,如果在void函数的结尾加入这句return ((crch<<8) | crcl); 代码将编译报错,但可以在需要的位置用return;跳出函数,unsigned int GetCRC16(unsigned char *ptr,  unsigned char len)是带返回参数的函数,可以将GetCRC16(unsigned char *ptr,  unsigned char len)看做是一个unsigned int 类型的数据,其实这个函数在调用是也是要设置一个unsigned int类型的变量,例如:unsigned int crc;而后crc = GetCRC16(buf, len-2);这样就把计算结果传递给了变量crc,而带入的参数在程序中已经标注了“// buf-接收到的命令帧指针,len-命令帧长度 */”。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-1-18 22:43:26 | 显示全部楼层
本帖最后由 广东梁百万 于 2022-1-18 22:52 编辑
慕名而来 发表于 2022-1-18 20:55
个人理解,void函数不能有返回值,如果在void函数的结尾加入这句return ((crch

谢谢,谢谢大家回复。
例程已经验证了,理解了语句意思,但问题又来了:用来校验单个8位数能正常得到CRC值,用来验证两个8位数得到的值与网上在线验证得到的值不同, 用来验证3个或3个以上的8位数,每执行一次那得到的值都不同,这就奇怪了,找了两晚都没找到原因,程序如下,求帮忙
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-18 22:51:48 | 显示全部楼层
本帖最后由 广东梁百万 于 2022-1-20 12:35 编辑

  例程已经验证了,理解了语句意思,但问题又来了:用来校验单个8位数能正常得到CRC值,用来验证两个8位数得到的值与网上在线验证得到的值不同, 用来验证3个或3个以上的8位数,每执行一次那得到的值都不同,这就奇怪了,找了两晚都没找到原因
程序是先执行      //CRC16测试程序2
          void crc16_tst2()
2022/1/20更新,经过两晚的苦思,终于找到了问题原因,是指针使用错误,指向的路径有问题。

跟着这个crc16_tst2() 调用 unsigned int crc16_tst1(unsigned char *buf,unsigned char len),
unsigned int crc16_tst1(unsigned char *buf,unsigned char len)再调用  unsigned int GetCRC16(unsigned char *ptr,  unsigned char len)

//-------------------
/* CRC16计算函数,ptr-数据指针,len-数据长度,返回值-计算出的CRC16数值 */
unsigned int GetCRC16(unsigned char *ptr,  unsigned char len)
{
    unsigned int index;
    unsigned char crch = 0xFF;  //高CRC字节
    unsigned char crcl = 0xFF;  //低CRC字节
        
    unsigned char code TabH[] = {  //CRC高位字节值表
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40  
    } ;  
    unsigned char code TabL[] = {  //CRC低位字节值表
        0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,  
        0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,  
        0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,  
        0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,  
        0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,  
        0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,  
        0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,  
        0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,  
        0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,  
        0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,  
        0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,  
        0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,  
        0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,  
        0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,  
        0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,  
        0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,  
        0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,  
        0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,  
        0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,  
        0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,  
        0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,  
        0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,  
        0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,  
        0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,  
        0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,  
        0x43, 0x83, 0x41, 0x81, 0x80, 0x40  
    } ;

    while (len--)  //计算指定长度的CRC
    {
        index = crch ^ *ptr++;
        crch = crcl ^ TabH[index];
        crcl = TabL[index];
    }
   
    return ((crch<<8) | crcl);  
}

                   //-------------------






         //CRC16测试程序1
         //buf-接收到的命令帧指针,len-命令帧长度 */
         unsigned int crc16_tst1(unsigned char *buf,unsigned char len)
         {
                   unsigned int  crc;
                 unsigned char crch, crcl;

       crc = GetCRC16(buf, len-2);  //计算CRC校验值   len数据长度减2 是后面两字节不作计算
       crch = crc >> 8;
       crcl = crc & 0xFF;
           return ((crch<<8) | crcl);
           

          }

          //CRC16测试程序2
          void crc16_tst2()
          {
           unsigned int  crc;
           unsigned char crch, crcl;
           unsigned char len;
           unsigned char *buf;
           buf=&bb1;    //指针对应验证测试的数据
           len=6;     //len数据长度

                //--------------
                bb1=0x01;    //验证测试的数据
                bb2=0x02;
                bb3=0x03;
                bb4=0x04;
                bb5=0x05;                                                                                 
                bb6=0x06;
                bb7=0x07;
                bb8=0x08;


                //--------------

           crc = crc16_tst1(buf,len);
        
           crch = crc >> 8;         //得到最终数据 CRC的高位
           crcl = crc & 0xFF;       //得到最终数据 CRC的低位

           }
回复 支持 反对

使用道具 举报

发表于 2022-1-19 10:43:54 | 显示全部楼层
广东梁百万 发表于 2022-1-18 22:43
谢谢,谢谢大家回复。
例程已经验证了,理解了语句意思,但问题又来了:用来校验单个8位数能正常得到CRC值 ...

我编程也很菜,因为玩C编程年头多了对常用代码的理解没有问题但CRC验证没弄过也请高手指正吧。
回复 支持 反对

使用道具 举报

发表于 2022-1-19 15:11:17 | 显示全部楼层
南天音乐 发表于 2022-1-17 10:18
个人觉得,对于C语言基础的问题,还是找个正儿八经的教程学个几个学时就掌握了,因为在论坛问的话,虽然大 ...

同意。基础的语法都没搞懂,后面大几率也没法调试bug,可以认为是自己都没花时间学习就上来问人了,发个c语言基础教程比回答问题更靠谱。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 23:11 , Processed in 0.156000 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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