相关疑难解决方法(0)

什么是便携式方法来查找size_t的最大值?

我想知道我的程序运行的系统上size_t的最大值.我的第一直觉是使用负1,就像这样:

size_t max_size = (size_t)-1;
Run Code Online (Sandbox Code Playgroud)

但我猜测有更好的方法,或者某个地方定义的常数.

c size-t

71
推荐指数
4
解决办法
3万
查看次数

为什么数组的最大大小"太大"?

我和这个答案的印象相同,size_t标准总是保证足够大以容纳给定系统的最大可能类型.

但是,此代码无法在gcc/Mingw上编译:

#include <stdint.h>
#include <stddef.h>

typedef uint8_t array_t [SIZE_MAX];
Run Code Online (Sandbox Code Playgroud)

错误:数组'array_t'的大小太大

我在这里误解了标准中的某些内容吗?被size_t允许为给定的实现是否过大?或者这是Mingw的另一个错误?


编辑:进一步的研究表明

typedef uint8_t array_t [SIZE_MAX/2];   // does compile
typedef uint8_t array_t [SIZE_MAX/2+1]; // does not compile
Run Code Online (Sandbox Code Playgroud)

这恰好是相同的

#include <limits.h>

typedef uint8_t array_t [LLONG_MAX];           // does compile
typedef uint8_t array_t [LLONG_MAX+(size_t)1]; // does not compile
Run Code Online (Sandbox Code Playgroud)

所以我现在倾向于认为这是Mingw中的一个错误,因为根据有符号整数类型设置最大允许大小没有任何意义.

c gcc mingw size-t stdint

56
推荐指数
3
解决办法
9743
查看次数

size_t的最大大小

我知道C返回类型的sizeof运算符是size_t在中定义的无符号整数类型<stdint.h>.这意味着它的最大尺寸应该65535在规定作为C99标准7.18.3:

limit of size_t
  SIZE_MAX             65535
Run Code Online (Sandbox Code Playgroud)

但是在gcc-4.8.2头文件stdint.h中定义的大小远远大于标准中所述的与下面所示的65535相矛盾的大小C99,

/* Limit of `size_t' type.  */
# if __WORDSIZE == 64
#  define SIZE_MAX              (18446744073709551615UL)
# else
#  define SIZE_MAX              (4294967295U)
# endif
Run Code Online (Sandbox Code Playgroud)

请帮助我理解为什么在我的误解背后存在差异或原因.

c gcc sizeof c99 size-t

36
推荐指数
1
解决办法
5万
查看次数

关于无符号整数下溢的C行为的问题

我已经在很多地方读过,整数溢出在C中定义得很好,与签名对应物不同.

下溢是一样的吗?

例如:

unsigned int x = -1; // Does x == UINT_MAX?
Run Code Online (Sandbox Code Playgroud)

谢谢.

我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1).

c types integer integer-overflow underflow

18
推荐指数
1
解决办法
2万
查看次数

标签 统计

c ×4

size-t ×3

gcc ×2

c99 ×1

integer ×1

integer-overflow ×1

mingw ×1

sizeof ×1

stdint ×1

types ×1

underflow ×1