Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原始数据类型的行为';值超出范围&;C99';s PRI*宏_C - Fatal编程技术网

原始数据类型的行为';值超出范围&;C99';s PRI*宏

原始数据类型的行为';值超出范围&;C99';s PRI*宏,c,C,假设我们有一个8位无符号整数n(UINT8_MAX=255);n=256的编译器的行为是什么?当数据类型的值超出不同数据类型的范围时,在哪里可以找到默认行为表?它们在超出范围时的行为是否有规律 #include <stdio.h> #include <inttypes.h> uint8_t n = UINT8_MAX; int main() { printf("%hhu ",n++); printf("%hhu",n); return 0; } #包括 #

假设我们有一个8位无符号整数n(
UINT8_MAX=255
);
n=256的编译器的行为是什么?当数据类型的值超出不同数据类型的范围时,在哪里可以找到默认行为表?它们在超出范围时的行为是否有规律

#include <stdio.h>
#include <inttypes.h>

uint8_t n = UINT8_MAX;
int main() {
  printf("%hhu ",n++);
  printf("%hhu",n);
  return 0;
}
#包括
#包括
uint8_t n=uint8_MAX;
int main(){
printf(“%hhu”,n++);
printf(“%hhu”,n);
返回0;
}
使用
gcc-std=c99-Wall*.c编译,这将打印:
255 0


另外,是否可以使用C99的PRI*宏?它们是如何命名的?

n=256
将带符号整数值
256
转换为
uint8\t
,然后将其分配给
n
。该转换由标准定义为取模-256的值,因此结果是
n
设置为
0

不确定在哪里可以找到表,但整数转换的规则见6.3.1.3:

当整数类型的值为 已转换为其他整数类型 除_Bool外,如果该值可以 以新类型表示,它是 不变

2否则,如果新类型为 无符号,则该值由 反复地加或减一 超过可以使用的最大值 以新类型表示,直到 该值在新值的范围内 (第49类)

3否则,新类型将被签名 并且该值不能在中表示 信息技术要么结果是 定义的实现或 实现定义的信号是 提高

正如AndreyT指出的,这不包括计算过程中出现超出范围值时发生的情况,而不是转换过程中发生的情况。对于6.2.5/9中包含的无符号类型:

涉及无符号的计算 操作数永远不会溢出,因为 无法用表示的结果 生成的无符号整数类型为 一个数的约化模 大于指定的最大值 可以由结果 类型

对于签名类型,3.4.3/3表示:

未定义行为的一个例子是整数溢出行为

(间接的,我知道,但我太懒了,不想在这是未定义行为的典型示例时继续搜索显式描述)

还请注意,在C中,整数提升规则相当棘手。算术运算总是在同一类型的操作数上执行,因此,如果表达式涉及不同的类型,则会有一系列规则来决定如何选择要在其中执行运算的类型。这两个操作数都升级到此通用类型。但它总是至少是一个int,因此对于像
uint8\u t
这样的小类型,算术将在
int
中完成,并在分配到结果时转换回
uint8\u t
。因此,例如:

uint8_t x = 100;
uint8_t y = 100;
unsigned int z = x * y;
结果为10000,而不是16,如果z也是一个
uint8\u t

另外,是否可以使用C99的PRI*宏?它们是如何命名的

谁能接受?我不介意,但您可能需要检查编译器是否支持它们。GCC的最早版本是3.4.4。其定义见7.8.1


如果您没有C标准的副本,请使用此:。这是标准的“草案”,在标准发布后一段时间发布,包括一些更正。

标准中描述了该行为

(*)无符号整数类型实现模运算。模等于2^N,其中N是类型中形成位的值的数目。这意味着无符号类型在溢出时“环绕”(在两端)。如果类型的最大值为255,则256将变为换行后的下一个值,即0

对于无符号类型,此行为的唯一例外是将浮点值转换为无符号类型。在溢出的情况下,行为是未定义的

(*)有符号整数类型不同。如果在从浮点类型转换期间发生溢出,则行为未定义(与无符号类型相同)。如果在从其他整数类型转换期间发生溢出,则结果由实现定义。如果在算术运算期间发生溢出,则行为未定义

(*)浮点类型在转换期间导致溢出的未定义行为