首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >达到255个后,uint8_t没有滚动到0,不能正常工作。

达到255个后,uint8_t没有滚动到0,不能正常工作。
EN

Stack Overflow用户
提问于 2019-05-09 08:25:24
回答 1查看 3.8K关注 0票数 9

我是C-Header- stdint.hinttypes.h的新手。为了了解uint8_t的工作原理,我正在尝试一些代码。但是,它似乎遇到了一个问题。

我分别声明了4个边界值为0、255、256、-1的uint8_t整数,并对其执行了一些简单的算术操作。我这么做是因为我想知道c编译器(我在linux上使用errors/warnings )生成什么gcc 5.4.0。如果不是,我想知道输出是什么样子的。下面给出的代码。

代码语言:javascript
运行
复制
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main() {
        int a = 10;
        printf("%d\n", a++);
        printf("%d\n\n", a);

        // 8 bit unsigned integer -> range[0, 255]
        uint8_t ua81=0, ua82=255, ua83=256, ua84=-1;
        printf("--------STDINT.H----uint8_t--DEMO--------\nua81 = %" PRIu8 "\n", ua81);
        printf("ua82 = %" PRIu8 "\nua83 = %" PRIu8 "\nua84 = %" PRIu8 "\n\n", ua82, ua83, ua84);
        printf("ua81+1 = %" PRIu8 "\nua82-3 = %" PRIu8 "\nua83-4+7 = %" PRIu8 "\nua84-1+20 = %" PRIu8 "\n----------\n\n", ua81+1, ua82-3, ua83-4+7, ua84-1+20);

        return 0;
}

此代码的输出如下:

代码语言:javascript
运行
复制
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ vi stdint_h.c
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ gcc -Wall stdint_h.c -o a
stdint_h.c: In function ‘main’:
stdint_h.c:11:33: warning: large integer implicitly truncated to unsigned type [-Woverflow]
  uint8_t ua81=0, ua82=255, ua83=256, ua84=-1;
                                 ^
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ ./a
10
11

--------STDINT.H----uint8_t--DEMO--------
ua81 = 0
ua82 = 255
ua83 = 0
ua84 = 255

ua81+1 = 1
ua82-3 = 252
ua83-4+7 = 3
ua84-1+20 = 274
----------

如前所述,我在gcc 5.4.0编译器中使用Linux机器。

代码语言:javascript
运行
复制
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我无法理解为什么变量ua84的值在到达255后不会滚动到0,而对于ua83也是如此。我认为,考虑到255个之后的滚转,ua84的价值应该是18

我觉得这与在编译时生成的与变量有关的warning中提到的warning隐式截断有关。我不知道到底是怎么回事。我还想知道如何继续使用uint8_t

EN

回答 1

Stack Overflow用户

发布于 2019-05-09 08:34:52

表达式ua84-1+20使变量ua84经历一个称为整数提升的过程:它被转换为一个int,然后整个表达式计算为一个int

然后将其打印为无符号int --您可能会看到PRIu8被定义为"u",这当然意味着unsigned int (即使传递了一个uint8_t,这也是因为变量函数如何提升其整数参数(uint8_t值被提升为int,然后由printf()作为unsigned int处理)。

详细信息:https://en.cppreference.com/w/c/language/conversion

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56055188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档