我在中看到了不同类型的整数定义stdint.h.我将以无符号32位整数为例.
uint32_t清楚地表示32位的无符号整数.这就是我经常使用的那个.
uint_fast32_t和uint_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?
谢谢你的解释.
我正在研究一个恰好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 …
我发现在C99你应该#include <stdint.h>也可以使用我的C++ 03 gcc编译器,但它是现代C++的正确标题,它是否可移植?
所述stdint.h报头缺少int_fastest_t并uint_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 …
请参阅以下wiki文本:
C99标准包括几种新整数类型的定义,以增强程序的可移植性[2].已经可用的基本整数类型被认为是不够的,因为它们的实际大小是实现定义的并且可能在不同系统之间变化.新类型在嵌入式环境中特别有用,在这些环境中,硬件通常只支持几种类型,并且支持因系统而异.所有新类型都在inttypes.h头文件中定义(C++中的cinttypes头文件),也可以在stdint.h头文件中找到(C++中的cstdint头文件).这些类型可以分为以下几类:
我的visual studio找不到这些文件:
<cstdint><cinttypes><stdint.h><inttypes.h>为什么?
有人可以解释各类型之间的差异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-Headers的新手- stdint.h和inttypes.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) 的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)
根据标准,所有三个定义是否正确?这三个实现之间是否还有其他区别(除了负数的处理)?
在VC6中编译时,我收到错误:
(致命错误C1083:无法打开包含文件:'stdint.h':没有这样的文件或目录)
任何人都可以解释为什么我收到此错误?
我在Nutshell中读C并发现:
"如果定义了可选的带符号类型(没有前缀u),则需要相应的无符号类型(带有初始u),反之亦然."
该段落是关于具有精确宽度(C99)的整数类型.
stdint ×10
c++ ×6
c ×4
c99 ×2
integer ×2
32bit-64bit ×1
architecture ×1
c++11 ×1
gcc5 ×1
header ×1
performance ×1
signed ×1
size-t ×1
standards ×1
std ×1
types ×1
uint8t ×1
unsigned ×1
visual-c++-6 ×1