Advertisement

size_t无符号数相关知识点

阅读量:

size_t无符号数相关知识点

当在代码进行编译操作时触发了一个关于有符号与无符号整数表达式比较的警告信息[-wsign-compare]

找到代码,告警这一段代码

复制代码
    size_t count = timeProtocol.m_intersectionArray.size();
    for (unsigned int i = 0; i < count; i++) {
    	//for循环操作
    }

我之前一直未能认识到核心问题到底是什么。我以为size_t是一种有符号数据类型,并认为必须将其转换为无符号类型。我也在群里发布了相关信息,但事实上我的理解是错误的。

由于最初对size_t的理解存在偏差(即它属于无符号类型),后来我发现所定义的变量i被设定为int型(建议将其改为属于无符号类型)。

我的这种误解被指出后感到有些不安,并认为这个修改确实过于谨慎了。尽管如此,在进一步反思后我还是觉得有必要采取这样的措施。

下面写个代码,验证可能出现的问题。

复制代码
    #include <iostream>
    #include <string>
    
    int main()
    {
    printf("\nstart first loop!\n");
    size_t count = 12;
    for(int i = 0; i < count; i++)
    {
        printf("%d ",i);
    }
    printf("\nfinish first loop!\n");
    
    /* * 上述代码是没有问题的。
     * unsigned int的范围是0——2^32 - 1;即 0 —— 4294967259
     * int的范围是-(2^31 - 1) —— 2^31 - 1;即 -2147483647——2147483647
     * 构造下面的错误
     */
    
    printf("\nstart second loop!\n");
    size_t count2 = 2147483648 + 1;
    count2 = 2147483648;
    int test = 2147483647 + 2;
    printf("test:%d\n",test);
    printf("unsigned int test:%u\n",(unsigned int)test);
    if(test < count2)           //test有符号整型,2147483647+2 = -2147483647,但是实际整型提升为无符号为2147483649,大于2147483648
    {
        printf("test < count2\n");
    }
    else
    {
        printf("test > count2\n");
    }
    for(int i = 0; i < count2; i++)
    {
        if(i > 2147483648 - 4)
        {
            printf("%d ",i);
        }
    }
    printf("\nfinish second loop!\n");
    
    /* * 上面是想构造一个错误的代码,但是构造失败了,原因是无符号和有符号对比是会整体提升
     * 并没有出现无限循环的情况
     * 那之前无线循环的是怎么构造的?下面按照自己的想法写一个
     */
    
    printf("\nfinish third loop!\n");
    for(int i = 0; i < 2147483648; i++)
    {
        if(i > 2147483648 - 4)
        {
            printf("%d ",i);
        }
    }
    if(test < 214748368)    //test=2147483647 + 2, 小于214748368,但是上面的for循环没有无限循环,调试一下。是因为i < 2147483648这边值写错了。勾线了无限循环的例子
    {
        printf("\ntest < 214748368\n");
    }
    else
    {
        printf("test > count2\n");
    }
    printf("\nfinish third loop!\n");
    
    
    return 0;
    }
    
    //这边还有一个问题,就是常量是什么类型的
    //这边搜到一个帖子:
    //start first loop!
    //0 1 2 3 4 5 6 7 8 9 10 11
    //finish first loop!
    //
    //start second loop!
    //test:-2147483647
    //unsigned int test:2147483649
    //test > count2
    //2147483645 2147483646 2147483647
    //finish second loop!
    //
    //finish third loop!
    //2147483645 2147483646 2147483647 2147483645 2147483646 2147483647 2147483645 2147483646 2147483647 2147483645 2147483646

增加无限循环示例代码

复制代码
    #define MAX 255
    int main(void)
    {
    ShowLambda();
    bool flag = false;
    int count = 0;
    unsigned char A[MAX], i;
    for (i = 0; i <= MAX; ++i) {
        if (i > 252) {
            flag = true;
        }
        if (flag && count < 20)
        {
            printf("%d ", i);
            count++;
        }
        A[i] = i;
    }
    return 0;
    }

打印信息

复制代码
    253 254 255 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

全部评论 (0)

还没有任何评论哟~