C-类型之间的区别 int32_t int_least32_t等
我曾经读过int32_t精确的32位长,int_least32_t至少32位,但是它们在我的stdint.h中都具有相同的typedefs.h: typedef int int_least32_t; 和 typedef int int32_t; 那么区别在哪里?他们完全一样... 解决方案 int32_t是签名的整数类型,宽度恰好为32位,没有填充位,并使用2的补语来获得负值. int_least32_t是最小的签名整数类型,宽度至少为32位. 仅当实施直接支持类型时才提供这些. 您所看到的类型仅意味着在您的环境中,这两个要求都可以通过标准int本身来满足.这并不意味着这些类型在不同的环境中是相同的. 其他解决方案 为什么您认为在另一台具有不同处理器的计算机上,不同的OS,不同版本的C标准Libs,您将确切看到此typedefs? 这两种类型正是您写的.其中一个是32位,另一种类型至少为32位.因此,可能的情况之一是它们两个都是32位,
16 2024-04-08
编程技术问答社区
ptrdiff_t在C语言中的定义是什么?
ptrdiff_t在c? 中定义在哪里 解决方案 它在stddef.h中定义. 标题定义积分类型size_t,ptrdiff_t和wchar_t,功能宏offsetof和常数宏NULL. 其他解决方案 如果您在Visual Studio 2015或更新中寻找ptrdiff_t,请务必注意,Microsoft再次通过在其版本的stddef.h中定义的ptrdiff_t而再次打破了所有可能的约定.自Visual Studio 2015以来,成为Unversal CRT的一部分(这是Windows SDK的一部分). stddef.h的所有类型定义现在都位于vcruntime.h中 - 仅offsetof()仍在offsetof()中.而不是包括stddef.h您应该包括stdint.h,其中包括stdint.h. 如果您需要它可以使用跨平台或与较旧版本的Visual Studio一起使用,则可以使用类似的东西: #if defined(_MSC_VER)
14 2024-04-07
编程技术问答社区
常见架构下最快的整数类型
stdint.h 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) * size
6 2024-04-07
编程技术问答社区
在C语言中定义16位整数
我需要声明16位的整数,c. 我知道短和int尺寸是机器依赖的. 我尝试使用"stdint.h",,但看来他们只是做 typedef short int16_t 所以我的问题是: 我是否缺少一些东西,而短类型可以保证16位长度? 如果否,是否有保证它的替代方法? 解决方案 含义int16_t在上定义为short您的机器,而不是所有机器. 只需使用绝对需要16位整数类型的int16_t即可;它将在提供stdint.h的所有平台上适当定义(这应该是支持C99或cstdint的所有平台. ). [edit] 要澄清," stdint.h"标头文件由C(或C ++)编译器提供,因此其内容可能会有所不同等等.也就是说,编译器套件的作者确切知道哪些类型具有哪些系统的大小.仅在一个系统上查看该文件,只能告诉您特定架构上特定OS上特定编译器的特定版本的定义(例如,Darwin X86_64上的GCC 4.2,或Winnt Alpha上的Visual
48 2024-04-07
编程技术问答社区
为什么每个人都把类型化定义放在标准C类型之上?
如果要使用 qt ,您必须拥抱quint8,quint16>所以. 如果您想使用 glib ,您必须欢迎guint8,guint16等等. on linux 有u32,s16等等. uc/os 定义SINT32,UINT16等等. ,如果您必须使用这些东西的某种组合,最好为麻烦做好准备.因为在您的计算机上u32将是typedef d quint32和quint32的typedef d会int typedef d,并且编译器将抱怨.. 如果有,为什么每个人都这样做?这是图书馆的某种传统吗? 开发这些库时, 解决方案 stdint.h不存在.因此,每个库制作了自己的typedefs. 其他解决方案 对于较旧的库,这是需要的,因为不存在有问题的标题(stdint.h). 但是,仍然存在一个问题:这些类型(uint64_t和其他类型)是标准中的可选功能.因此,符合的实施可能不会与他们一起运送 - 因此迫使图书馆仍将其包括在内.
18 2024-04-06
编程技术问答社区
[u]int_fastN_t类型应该如何为x86_64定义,是否有x32 ABI?
x32 abi 指定,除其他外,用于生成的代码32位指针. X86_64体系结构.它结合了X86_64体系结构(包括64位CPU寄存器)的优势和32位指针的开销. 标头定义typedefs int_fast8_t,int_fast16_t,int_fast32_t和int_fast64_t(以及相应的无符号类型uint_fast8_t等),每个类型是: 通常在所有人中使用最快的整数类型 整数类型至少具有指定的宽度 带脚注: 对于所有目的而言,指定的类型不能保证最快. 如果实现没有明确的理由选择一种类型 另一个,它只会选择一些满足的整数类型 签名和宽度要求. (引用问题是,在有或没有X32 ABI的情况下,如何定义[u]int_fast16_t和[u]int_fast32_t类型?有没有指定这些类型的X32文档?它们是否应该与32位X86定义(32位)兼容,或者由于X32可以访问64位CPU寄存器,是否应该在有或没有X32 ABI的情况下具
4 2024-04-06
编程技术问答社区
stdint.h和inttypes.h的区别
stdint.h和inttypes.h? 有什么区别 如果没有使用它们,则未识别uint64_t,但其中任何一个都是定义的类型. 解决方案 请参阅Wikipedia文章ininttypes.h. 使用stdint.h进行最小的定义集;如果您还需要在printf,scanf等人中对这些支持的便携式支持,请使用inttypes.h. 其他解决方案 stdint.h 包括此文件是"最小要求",如果您想使用C99的指定宽度整数类型(即int32_t,uint16_t等). 如果包含此文件,则将获得这些类型的定义,因此您可以在变量和函数声明中使用这些类型,并使用这些数据类型进行操作. inttypes.h 如果包含此文件,您将获得stdint.h提供的所有内容(因为inttypes.h包括stdint.h),但是您也将获得做printf>的设施和scanf (以及fprintf,fscanf等.)以便携式方式使用这些类型.例如,您将获得PRIu64宏,以
34 2024-04-06
编程技术问答社区
使用(或不使用)stdint的原因
我已经知道,stdint在平台之间需要特定的变量时,stdint是习惯的.我现在真的没有这样的问题,但是除了上面已经显示的事实外,使用它的缺点和优点是什么? 在stackoverflow和其他网站上寻找此问题,我发现了2个链接,这些链接对待主题: codealia "> codealias.info stdint. stackoverflow - 这是更具体的,关于 uint> uint8_t.t8_t_t8_t . ,如果有人希望更多地了解此标头的主要原因 - 便携性,这两个链接非常好.但是对我来说,我最喜欢的是我认为uint8_t比unsigned char更干净(例如,用于存储RBG通道值),int32_t看起来比简单的int等看起来更有意义. P> 那么,我的问题是,除了可移植性之外,使用stdint的缺点和优点是什么?我应该仅在代码的某些细节部分或任何地方使用它吗?如果到处都是,如何使用atoi(),strtok()等函数? 谢谢! 解决方
12 2024-04-06
编程技术问答社区
为什么一个数组的最大尺寸会 "太大"?
我的印象与这个答案,size_t始终由标准保证足够大以容纳给定系统的最大类型. 但是,此代码无法在GCC/Mingw上进行编译: #include #include typedef uint8_t array_t [SIZE_MAX]; 错误:数组'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 恰好与 相同 #include typedef uint8_t array_t [LLONG_MAX]; // does compi
14 2024-04-06
编程技术问答社区
C: gcc中的uint16_t减法行为
我正在尝试减去两个未签名的INT,并将结果与​​签名的INT(或字面意思)进行比较.当使用unsigned int类型时,行为是预期的.当使用uint16_t(来自stdint.h)类型时,行为不是我期望的.使用GCC 4.5进行了比较. 给定以下代码: unsigned int a; unsigned int b; a = 5; b = 20; printf("%u\n", (a-b)
10 2023-11-09
编程技术问答社区
如何检查是否定义了固定宽度的整数
在C ++中,固定宽度整数定义为可选,但是我可以't似乎找到了建议检查它们是否实际定义的推荐方法. 什么是一种便携式检查固定宽度整数是否可用的方法? 解决方案 要确定是否提供了固定宽度整数类型,您可以检查是否定义了相应的[U]INT*_MAX或[U]INT*_MIN宏. // may be necessary for your C++ implementation #define __STDC_LIMIT_MACROS #include #ifdef INT32_MAX // int32_t must be available to get here int32_t some32bitIntVariable; #endif per 对于本文所述的每种类型所提供的类型,应声明typedef名称和定义关联的宏.相反,对于本文所述实施不提供的每种类型,不得声明typedef名称也不应定义相关的宏. .
24 2023-10-30
编程技术问答社区
用swig和numpy.i使用stdint
我正在开发一个基于swig python代码中c inline的模块. 为此,我想在C中访问numpy数组.到现在为止 不幸的是,当使用stdint.h类型时,c++ - 功能无法正确包装.给出的错误是:_setc() takes exactly 2 arguments (1 given).这意味着,该函数不会包装为接受numpy数组.当我使用例如unsigned short. 您有什么想法吗,我如何制作swig map numpy数组stdint-types? interface.i不工作: /* interface.i */ extern int __g(); %} %include "stdint.i" %include "numpy.i" %init %{ import_array(); %} %apply (uint16_t* INPLACE_ARRAY3, int DIM1) {(uint16_t* seq, int n1)}; extern int _
12 2023-10-10
编程技术问答社区
为什么Microsoft Visual Studio找不到<stdint.h>?
可能的重复: Visual Studio支持新的C/C ++标准? 请参阅下面的文字,摘自 wiki : C99标准包括几种新整数类型的定义,以增强程序的可移植性[2].已经可用的基本整数类型被认为不足,因为它们的实际尺寸是定义的,并且可能在不同的系统中有所不同.新型类型在嵌入式环境中特别有用,在嵌入式环境中,硬件支持通常仅几种类型,并且支持因系统而异.所有新类型均在inttypes.h标题(C ++中的Cinttypes标头)中定义,并且也可在stdint.h Header(CSTDINT标题中)提供.这些类型可以分为以下类别: 我的Visual Studio找不到任何此文件: 为什么? 解决方案 编辑 请注意,从Visual Studio 2013开始, c99库支持已添加到Visual Studio中. 下面的答案是我在Visual
132 2023-09-29
编程技术问答社区
这是glibc printf的一个错误吗?
使用stdint.h来自Glibc(GCC Suse Linux版本9.2.1,Intel Core i7处理器),直接打印INT32_MIN时,我遇到了最奇怪的行为: #include #include void main(void) { printf("%d\n", INT16_MIN); int a = INT16_MIN; printf("%d\n", a); printf("%ld\n", INT32_MIN); long b = INT32_MIN; printf("%ld\n", b); printf("%ld\n", INT64_MIN); long c = INT64_MIN; printf("%ld\n", c); } 输出: -32768 -32768 2147483648 -2147483648 -9223372036854775
166 2023-06-15
编程技术问答社区
在CUDA NVRTC代码中包括C标准头文件
我正在编写使用NVRTC在运行时编译的CUDA内核(CUDA版本9.2,带有NVRTC版本7.5),该版本需要stdint.h header,以便具有int32_t>类型. 如果我不包含包含的内核源代码,则可以正常工作.例如内核 extern "C" __global__ void f() { ... } 将F定义为.visible .entry f的PTX代码编译为PTX代码. 但是,如果内核源代码为 #include extern "C" __global__ void f() { ... } 它报告A function without execution space annotations (__host__/__device__/__global__) is considered a host function, and host functions are not allowed in JIT mode.(也没有extern "
36 2023-06-14
编程技术问答社区
有没有一种可移植的方法来知道uintptr_t是否在stdint.h中定义?
序言:我想将指针转换为整数类型,例如检查对齐. uintptr_t似乎是正确的类型,但是仅在IN中保证C,不在C ++(或C ++ 11) 对于以下代码: #include #ifndef I_WONDER_IF_UINTPR_T_IS_DEFINED typedef unsigned long uintptr_t; #endif template bool isAligned(unsigned char* p) ///Checks alignment with respect to some data type { return !((uintptr_t) p % sizeof(T)); } template bool isAligned(unsigned char* p); template bool isAligned(unsigned char* p); templa
28 2023-03-02
编程技术问答社区
uint32_t vs uint_fast32_t vs uint_least32_t
我在stdint.h中看到了整数的不同类型.我以未签名的32位整数为例. uint32_t显然是指32位的无符号整数.那是我一直使用的. uint_fast32_t和uint_least32_t:与uint32_t有什么区别,什么时候应该使用它们代替uint32_t? 现在,我看到uintX_t其中x是24、40、48和56.在我的代码中,我必须使用48位和56位整数.例如,我想uint24_t被定义为这样的东西: struct uint24_t { unsigned int the_integer : 24; }; 我对吗?而且,您是否建议我为我的48位未签名整数使用uint48_t,或者我应该使用普通uint64_t? 感谢您的解释. 解决方案 uint32_t 有什么区别 uint_fast32_t是至少32位的无符号类型,是(以某种一般方式)最快的类型. "快速"是指考虑到一个选择,实施者可能会选择架构具有算术,负载和存储指令的大
96 2023-03-02
编程技术问答社区
<cstdint>与<stdint.h>对比
stdint.h和cstdint? 有什么区别 两者都在MSVC(Visual Studio 2010)和GCC-4.5.1中获得.还定义intX_t/uintX_t类型(其中X是类型的字节中的大小). 如果两个标题中的基本原理都是相同的(便携式类型),我必须做出哪些决定来决定一个或另一个? stdint.h定义每种类型而没有任何名称空间,cstdint类型位于std命名空间中. 是否有任何理由包括或不包括定义的类型纳入std名称空间?两个标题之间有什么不同? cstdint没有文件扩展名,并使用stdint.h前缀,stdint.h使用.h扩展. 该标题的命名约定是什么? c前缀表示这是C库? cstdint>? 中缺乏文件扩展名是有原因的. 解决方案 C ++ 98中的最初意图是您应该在C ++中使用,以避免污染全局名称空间(嗯,尤其不是,仅在C ++ 11中添加了但是总体标题)
76 2023-02-23
编程技术问答社区
将uint32_t铸成int32_t并在之后进行比较
我很难理解如何比较两个INT,其中一个是未签名的INT32,另一个是INT32工作. 让我们考虑这个简单的程序: #include int main() { uint32_t a1 = UINT32_MAX; int32_t b1 = (int32_t)a1; if (a1 == b1) printf("Equal"); else printf("Not equal"); return 0; } 在这种情况下,a1超过了一个符号的32位整数范围,因此,正如我在调试时所确认的,在施放后,b1 equals -1. 但是,它仍然打印出"相等",而这些值显然并不相同.它是由什么? 引起的 解决方案 正如您所做的那样,实现定义了的实现. 在大多数实现中,您可能会遇到,将uint32_t的最大值转换为int32_t意味着保留位模式并将其视为签名值.这意味着b1被分配了值-1.
120 2023-02-04
编程技术问答社区
如何在C语言中打印一个int64_t的类型
c99标准具有整数类型,具有字节大小,如INT64_T.我使用Windows的%I64d格式(或unsigned %I64u),如: #include #include int64_t my_int = 999999999999999999; printf("This is my_int: %I64d\n", my_int); ,我得到这个编译器警告: warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’ 我试过: printf("This is my_int: %lld\n", my_int); // long long decimal 但我得到了同样的警告.我正在使用这个编译器: ~/dev/c$ cc -v Using built-in specs. Target: i686-apple-darwin10
1382 2023-02-02
编程技术问答社区