Tag: 类型

为什么我们将INT_MIN定义为-INT_MAX – 1?

AFAIK这是一个标准的“习语” # define INT_MIN (-INT_MAX – 1) # define INT_MAX 2147483647 问题:为什么INT_MIN的定义不是-2147483648?

“C变量类型的大小取决于机器。”这是真的吗? 已签名和未签名的号码;

我被告知C类型取决于机器。 今天我想validation它。 void legacyTypes() { /* character types */ char k_char = ‘a’; //Signedness –> signed & unsigned signed char k_char_s = ‘a’; unsigned char k_char_u = ‘a’; /* integer types */ int k_int = 1; /* Same as “signed int” */ //Signedness –> signed & unsigned signed int k_int_s = -2; unsigned int k_int_u […]

不同体系结构中C的int大小

我知道C语言的规范并没有规定每个整数类型的确切大小(例如, int )。 我想知道的是:C(不是C ++)中是否有一种方法来定义具有特定大小的整数类型,以确保它在不同的体系结构中是相同的? 喜欢: typedef int8 typedef int16 或者任何其他允许程序的其他部分在不同体系结构上编译的方式。

C / C ++编译器如何处理具有不同值范围的类型之间的类型转换?

如何在不丢失编译器内部数据的情况下进行类型转换? 例如: int i = 10; UINT k = (UINT) k; float fl = 10.123; UINT ufl = (UINT) fl; // data loss here? char *p = “Stackoverflow Rocks”; unsigned char *up = (unsigned char *) p; 编译器如何处理这种类型转换? 显示位的低级示例将受到高度赞赏。

将一个int指针转换为char ptr,反之亦然

问题很简单。 据我了解,GCC认为字符将是字节对齐的,并且在32位环境中对齐4字节对齐。 我也知道C99标准6.3.2.3,它表示在未对齐的指针类型之间进行转换会导致未定义的操作。 C的其他标准对此有何评论? 这里也有许多经验丰富的编码员 – 对此有任何看法将不胜感激。 int *iptr1, *iptr2; char *cptr1, *cptr2; iptr1 = (int *) cptr1; cptr2 = (char *) iptr2;

如何在C代码中获取变量的类型?

有没有什么方法可以在C中自动发现变量的类型,或者通过程序本身的某种机制,或者 – 更可能 – 通过使用编译器的预编译脚本传递到它的位置解析了变量并为它们分配了类型? 我正在寻找关于此的一般性建议。 下面是关于我需要什么和为什么的更多背景。 我想改变OpenMP减少子句的语义。 在这一点上,简单地通过调用函数替换源代码中的子句(通过脚本)似乎是最容易的,然后我可以定义函数来实现我想要的缩减语义。 例如,我的脚本会转换它 #pragma omp parallel for reduction(+:x) 进入这个: my_reduction(PLUS, &x, sizeof(x)); #pragma omp parallel for 在哪里,我早些时候(比方说) enum reduction_op {PLUS, MINUS, TIMES, AND, OR, BIT_AND, BIT_OR, BIT_XOR, /* … */}; 并且my_reduction有签名 void my_reduction(enum reduction_op op, void * var, size_t size); 除此之外, my_reduction必须像程序员最初预期的那样将加法运算应用于简化变量。 但我的function无法知道如何正确地做到这一点。 特别是,虽然它知道操作的类型( PLUS ),原始变量的位置( var )以及变量类型的大小,但它不知道变量的类型本身。 […]

为什么GLib重新定义类型?

在GLib中重新定义类型背后的原因是什么? 为什么他们把char变成gchar , int变成gint等等?

比较C中不同数据类型的一般规则是什么?

可以说我有以下场景: int i = 10; short s = 5; if (s == i){ do stuff… } else if (s < i) { do stuff… } 当C进行比较时,它会转换较小的数据类型,在这种情况下,short是int还是将右边的数据类型转换为左边的数据类型? 在这种情况下int为short?

char和通常的算术转换规则

我知道这个问题已被提出,并且似乎已经回答了无数次,但我似乎无法将答案与我自己的经验相匹配。 C标准规定,对于加法“两个操作数应具有算术类型”(6.5.6.1)。 Arithemitc类型包括整数和浮点类型(6.2.5.18),最后整数类型是char,short,int,long和long long,它们以有符号和无符号类型(6.2.5.4和6.2.5.6)存在。 根据通常算术转换的规则“如果两个操作数具有相同的类型,则不需要进一步转换。” 到现在为止还挺好。 我的理解,如“C书”中所示,“[n] o算术由C以比int短的精度完成”,这是应用积分推广的地方。 我似乎没有在标准中找到这个参考,我好像已经看过很多次了。 由于unsigned char是算术类型,并且通常算术转换的规则表明相同类型的操作数不需要转换,为什么需要进行积分提升? 我使用两个不同的编译器测试了这个。 我写了一个简单的程序,它添加了char: unsigned char a = 1; unsigned char b = 2; unsigned char c = a + b; 目标平台是使用8位架构的Atmel Mega8 uC。 因此,如果操作数应该进行整体提升,则整数加法将需要使用两个寄存器。 使用imagecraft avr编译器进行编译,没有优化,并且启用了严格的ANSI C可移植性选项,产生了这个汇编代码: mov R16, R20 add R16, R18 使用avr-gcc(我不知道类似于gcc的-strict的ANSI开关): $ avr-gcc -O0 -mmcu=atmega8 -S -c main.c 结果汇编: ldd r25,Y+1 ldd […]

C ++中的固定宽度整数

偶尔我需要使用固定宽度的整数与PLC等外部设备进行通信。 我还使用它们来定义位掩码并执行图像数据的位操作。 AFAIK C99标准定义了固定宽度的整数,如int16_t。 但是我使用的编译器,VC ++ 2008不支持C99和AFAIK微软不打算支持它。 我的问题是在C ++中使用固定宽度整数的最佳实践是什么? 我知道VC ++定义了非标准的固定宽度整数,如__int16,但我对使用非标准类型犹豫不决。 下一个C ++标准是否会定义固定宽度的整数?