我是C-Header- stdint.h
和inttypes.h
的新手。为了了解uint8_t
的工作原理,我正在尝试一些代码。但是,它似乎遇到了一个问题。
我分别声明了4个边界值为0、255、256、-1的uint8_t
整数,并对其执行了一些简单的算术操作。我这么做是因为我想知道c编译器(我在linux上使用errors/warnings )生成什么gcc 5.4.0
。如果不是,我想知道输出是什么样子的。下面给出的代码。
#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;
}
此代码的输出如下:
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机器。
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
。
发布于 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://stackoverflow.com/questions/56055188
复制相似问题