标签: stdint

uint32_t vs uint_fast32_t vs uint_least32_t

我在中看到了不同类型的整数定义stdint.h.我将以无符号32位整数为例.

  1. uint32_t清楚地表示32位的无符号整数.这就是我经常使用的那个.

  2. uint_fast32_tuint_least32_t:有什么区别,什么uint32_t时候应该使用它们而不是uint32_t

现在,我看到uintX_tX是24,40,48和56.在我的代码中发生了我必须使用48和56位整数.举个例子,我认为uint24_t定义如下:

struct uint24_t { unsigned int the_integer : 24; };
Run Code Online (Sandbox Code Playgroud)

我对吗 ?并且,您是否建议我使用uint48_t我的48位无符号整数或我应该使用正常uint64_t

谢谢你的解释.

c++ integer stdint c++11

16
推荐指数
2
解决办法
6176
查看次数

哪个C++标准头定义了SIZE_MAX?

我正在研究一个恰好SIZE_MAX在几个地方使用的现有C++代码库.我做了一些重构,现在SIZE_MAX没有在其中一个模块中定义.当Travis-CI尝试在Linux上构建项目时出现此问题.它在重构之前工作正常,但是跟踪包含哪些精确的头文件很困难.

为了在本地复制问题,我安装了一个带有默认gcc的Ubuntu VM,并且能够重现它.以下是相关来源:

#include <stddef.h>

int main()
{
    size_t a = SIZE_MAX;
}
Run Code Online (Sandbox Code Playgroud)

命令行很简单:

g++ a.cpp
Run Code Online (Sandbox Code Playgroud)

错误是:

a.cpp: In function ‘int main()’:
a.cpp:5:16: error: ‘SIZE_MAX’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

系统信息:

$ uname -a
Linux quartz 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)

我曾尝试包括cstdint,stdint.h,limits.h,inttypes.h,stdio.h,stdlib.h,,可能有一些人,我想不出我需要哪些特定的头文件SIZE_MAX.

重要的是要注意我正在编写的程序编译正常SIZE_MAX …

c++ header size-t stdint

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

现代C++中uintptr_t类型的头文件是什么?

我发现在C99你应该#include <stdint.h>也可以使用我的C++ 03 gcc编译器,但它是现代C++的正确标题,它是否可移植?

c++ c99 32bit-64bit stdint

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

通用架构的最快整数类型

所述stdint.h报头缺少int_fastest_tuint_fastest_t与对应{,u}int_fastX_t的类型.对于整数类型的宽度无关紧要的情况,如何选择允许处理最大位数且性能损失最小的整数类型?例如,如果使用朴素方法在缓冲区中搜索第一个设置位,则可能会考虑这样的循环:

// return the bit offset of the first 1 bit
size_t find_first_bit_set(void const *const buf)
{
    uint_fastest_t const *p = buf; // use the fastest type for comparison to zero
    for (; *p == 0; ++p); // inc p while no bits are set
    // return offset of first bit set
    return (p - buf) * sizeof(*p) * CHAR_BIT + ffsX(*p) - 1;
}
Run Code Online (Sandbox Code Playgroud)

当然,使用char会导致更多的操作int.但是long long …

c architecture performance integer stdint

13
推荐指数
2
解决办法
5962
查看次数

为什么Microsoft Visual Studio找不到<stdint.h>?

可能重复:
Visual Studio支持新的C/C++标准?

请参阅以下wiki文本:

C99标准包括几种新整数类型的定义,以增强程序的可移植性[2].已经可用的基本整数类型被认为是不够的,因为它们的实际大小是实现定义的并且可能在不同系统之间变化.新类型在嵌入式环境中特别有用,在这些环境中,硬件通常只支持几种类型,并且支持因系统而异.所有新类型都在inttypes.h头文件中定义(C++中的cinttypes头文件),也可以在stdint.h头文件中找到(C++中的cstdint头文件).这些类型可以分为以下几类:

我的visual studio找不到这些文件:

  1. <cstdint>
  2. <cinttypes>
  3. <stdint.h>
  4. <inttypes.h>

为什么?

c++ std stdint

10
推荐指数
1
解决办法
4万
查看次数

__u8和uint8_t之间的区别

有人可以解释各类型之间的差异uint8_t__u8

我知道这uint8_t是在stdint.h中定义的,并且它们在每个unix系统上都可用.

/* Unsigned.  */
typedef unsigned char       uint8_t;
typedef unsigned short int  uint16_t;
...
Run Code Online (Sandbox Code Playgroud)

如果我使用它们可以识别我打算做什么.

现在我偶然发现了__u8__u16类型.它似乎对我来说是一样的.

其中一些类型在linux/types.h中定义

#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
#else
#define __bitwise__
#endif
#ifdef __CHECK_ENDIAN__
#define __bitwise __bitwise__
#else
#define __bitwise
#endif

typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
typedef __u32 __bitwise __le32;
...
Run Code Online (Sandbox Code Playgroud)

我没找到,__u8但我仍然可以使用它,它的行为就像uint8_t.

性能或内存消耗有一些差异吗?

感谢帮助 :)

c++ types stdint

9
推荐指数
1
解决办法
8920
查看次数

uint8_t在达到255后无法正常翻转至0,无法正常工作

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

我已经声明了4 uint8_t个分别具有边界值0、255、256,-1的整数,并对其执行了一些简单的算术运算。我这样做是因为我想知道C编译器(我在Linux上使用)会产生什么错误/警告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 …
Run Code Online (Sandbox Code Playgroud)

c stdint uint8t gcc5

9
推荐指数
2
解决办法
849
查看次数

为什么“ stdint.h”的实现在UINT8_C的定义上存在分歧?

UINT8_C宏在“stdint.h”中定义,用下面的说明书UINTN_C(value)应扩展到对应于该类型的整数常量表达式uint_leastN_t

但是,在一般情况下,实现方式有所不同:

#define UINT8_C(value) ((uint8_t) __CONCAT(value, U))  // AVR-libc
#define UINT8_C(x_)    (static_cast<std::uint8_t>(x_)) // QP/C++
#define UINT8_C(c)     c                               // GNU C Library
Run Code Online (Sandbox Code Playgroud)

前两个实现看起来大致相同,但是第三个实现的行为有所不同:例如,以下程序1使用AVR-libc和QP / C ++进行打印,但是-1使用glibc(因为有符号值的右移会传播符号位)。

std::cout << (UINT8_C(-1) >> 7) << std::endl; // prints -1 in glibc
Run Code Online (Sandbox Code Playgroud)

display的实现UINT16_C显示相同的行为,但不显示UINT32_C,因为其定义包括U后缀:

#define UINT32_C(c) c ## U
Run Code Online (Sandbox Code Playgroud)

有趣的是,由于有错误报告,glibc 在2006年UINT8_C更改定义。先前的定义为,但是由于整数提升规则而产生了错误的输出()。#define UINT8_C(c) c ## Ufalse-1 < UINT8_C(0)

根据标准,所有三个定义是否正确?这三个实现之间是否还有其他区别(除了负数的处理)?

c c++ standards integer-promotion stdint

9
推荐指数
2
解决办法
386
查看次数

VC6:致命错误C1083:无法打开包含文件:'stdint.h'

在VC6中编译时,我收到错误:

(致命错误C1083:无法打开包含文件:'stdint.h':没有这样的文件或目录)

任何人都可以解释为什么我收到此错误?

visual-c++-6 stdint

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

为什么在C语言中每个有符号的int类型都必须有相应的unsigned int类型?

我在Nutshell中读C并发现:

"如果定义了可选的带符号类型(没有前缀u),则需要相应的无符号类型(带有初始u),反之亦然."

该段落是关于具有精确宽度(C99)的整数类型.

c unsigned signed c99 stdint

8
推荐指数
1
解决办法
151
查看次数