Tag: 原始类型

简单的C数据类型

可能重复: int8_t,int_least8_t和int_fast8_t的区别? 我很困惑。 我想……(如果我错了,请纠正我) u_int8_t = unsigned short ? u_int16_t = unsigned int ? u_int32_t = unsigned long ? u_int64_t = unsigned long long ? int8_t = short ? int16_t = int ? int32_t = long ? int64_t = long long ? 然后int_fast8_t是什么意思? int_fastN_t ? int_least8_t ?

sizeof(int)<= sizeof(long)<= sizeof(long long)总是如此?

从C标准来看,int具有至少16位,长度至少为32位且长度至少为64位(如果有的话)(某些平台可能不支持)。 只是想知道作为标题的句子是否总是正确的。

ARM cortex-M3 uint_fast32_t vs uint32_t

我正在为STM32Fx cortex-M3系列处理器开发一个程序。 在stdint.h中定义了以下内容: typedef unsigned int uint_fast32_t; typedef uint32_t uint_least32_t; typedef unsigned long uint32_t; 据我了解。 [u]int_fast[n]_t will give you the fastest data type of at least n bits. [u]int_least[n]_t will give you the smallest data type of at least n bits. [u]int[n]_t will give you the data type of exactly n bits. 据我所知sizeof(unsigned int)<= sizeof(unsigned […]

是否有标准的C头文件为所有基本类型分配数值?

我有一些代码根据底层数据类型执行不同的操作。 例如: void *some_data = obtain_data(); int data_type = obtain_data_type(); switch(data_type) { case CHAR: handle_char(some_data); break; case SHORT: handle_short(some_data); break; case INT: handle_int(some_data); break; // etc… } 为了使其工作,我需要一个枚举或常量,为CHAR,SHORT,INT等分配一个数值.EG: enum POD_TYPES { CHAR = 1, SHORT = 2, INT = 3 // etc. } “滚动我自己”在这里是微不足道的,但似乎应该有一种更成熟的方式来实现这一目标。 是否有一个标准(或至少是常用的)头文件,我可以包含已经在某处定义了这些值? 我没有在cppreference的库头中看到任何内容。 inttypes.h似乎接近了,但经过进一步检查,这些类型都是用于转换或确定整数的系统特定最小/最大值的宏。

在预处理器中从常量中删除强制转换

背景 在微控制器代码中,我使用的是生产者提供的库,其中定义了许多常量。 如果我的一些常量(与微控制器之外的组件共享,使用git-subtree )和微控制器常量之间存在不匹配,我试图给出错误。 例如,库定义: #ifdef SOME_PARTICULAR_MODEL #define FLASH_BLOCK_SIZE ((uint8_t)64) /* else, other models */ #endif 在某处,在微控制器代码和PC上编译的一些代码之间共享的标题中,我有例如: #define MYPROG_BLOCK_SIZE 64 为了确保这些常量匹配,在微控制器代码中,两个常量都存在,我有: #if MYPROG_BLOCK_SIZE != FLASH_BLOCK_SIZE #error “mismatch between actual block size and defined block size” #endif 这是为了确保代码是否曾被移植到更大的微控制器,共享头也将被更新。 问题 问题是这会减少到: #if 64 != ((uint8_t)64) 我不确定它是否是有效的C ,但仍然使编译器窒息。 测试,我发现问题不在于uint8_t是一个typedef,并且它仍然会被一个强制转换为int ,例如。 问题 有没有办法从定义为((uint8_t)64)的值中删除(uint8_t)部分? 如果没有,有没有办法改变它,所以表达式变成一个没有演员? 我想过将uint8_t定义为某些内容并在#if之后取消定义它,但我无法弄清楚如何避免(Y)X转换性质并将其转换为算术表达式。

C和C ++中的整数/算术类型的大小保证

我知道C ++标准明确地保证了char , signed char和unsigned char 。 此外,它还提供了保证,例如, short至少与char , int和short等一样大。但是没有明确保证绝对值,比如sizeof(int) 。 这是我头脑中的信息,我和它幸福地生活在一起。 不久前,我在SO中找到了一条评论(找不到它),在C long中保证至少有4个字节,并且该要求是由C ++“inheritance”的。 是这样的吗? 如果是这样,我们对C ++中算术类型的大小有什么其他的隐含保证? 请注意,我对这个问题中不同平台的实际保证完全不感兴趣,只是理论上的保证。