Tag: 类型

C中的opaque(抽象)数据类型

文件api.h #include #ifndef API #define API struct trytag; typedef struct trytag try; void trial (try *); #endif 文件core.h #ifndef CORE #define CORE struct trytag { int a; int b; }; #endif 文件func.c #include “api.h” #include “core.h” void trial (try *tryvar) { tryvar->a = 1; tryvar->b = 2; } 文件main.c #include “api.h” int main () { […]

C中的类型推广

我对以下代码感到困惑: #include #include int main(int argc, char ** argv) { uint16_t a = 413; uint16_t b = 64948; fprintf(stdout, “%u\n”, (a – b)); fprintf(stdout, “%u\n”, ((uint16_t) (a – b))); return 0; } 返回: $ gcc -Wall test.c -o test $ ./test 4294902761 1001 $ 似乎表达式(a-b)具有类型uint32_t。 我不明白为什么因为两个运算符都是uint16_t。 任何人都可以向我解释这个吗?

32位机器上的long long int

非常简单的问题,我读到GCC支持long long int类型。 但是,当CPU仅为32位宽时,如何使用它进行数学运算?

C – 可移植地获取类型对齐

我正在为一个非常简单的语言编写一个非常小的解释器,它允许简单的结构定义(由其他结构和简单类型组成,如int,char,float,double等)。 我希望字段尽可能少地使用字段,因此使用max_align_t或类似的东西是不可能的。 现在,我想知道是否有更好的方法来获得除此之外的任何单一类型的对齐: #include #include #define GA(type, name) struct GA_##name { char c; type d; }; \ const unsigned int alignment_for_##name = offsetof(struct GA_##name, d); GA(int, int); GA(short, short); GA(char, char); GA(float, float); GA(double, double); GA(char*, char_ptr); GA(void*, void_ptr); #define GP(type, name) printf(“alignment of “#name” is: %dn”, alignment_for_##name); int main() { GP(int, int); GP(short, short); […]

C / C ++使用int或unsigned int

在很多代码示例,源代码,库等中我看到使用int时,就我所知,unsigned int会更有意义。 我看到的一个地方很多是for循环。 见下面的例子: for(int i = 0; i < length; i++) { // Do Stuff } 为什么你会使用int而不是unsigned int? 这只是懒惰吗 – 人们不会因打字unsigned而烦恼吗?

uint128_t没有命名类型

我正在将一些代码从C转移到C ++。 在转换期间我遇到了: uint128_t没有命名类型 我的编译器:gcc版本5.2.1 我的操作系统:Ubuntu 15.1 这个编译好的C和我认为它将通过包括stdint.h解决,但它没有。 到目前为止,我还没有尝试过其他任何事情,因为似乎没有关于此错误的大量信息( 示例 )。 uint128_t在整个程序中使用并且对于构建是必不可少的,因此我无法删除它,并且我不确定使用不同的整数类型。 以下是使用位置和方式的示例。 union { uint16_t u16; uint32_t u32; uint128_t u128; } value; 是否可以定义uint128_t或者我应该查看我的编译器?

sizeof(size_t)== sizeof(void *)总是如此吗?

C99 / C ++ 11标准是否保证sizeof(size_t) == sizeof(void*)始终为真? size_t f(void* p) { return (size_t)(p); // Is it safe? } void* f(size_t n) { return (void*)(n); // Is it safe? }

如何/为什么imagedata存储为char – OpenCV

我有点困惑。 我刚刚开始使用OpenCV,它的图像数据由char指针指向。 考虑到实际数据本身可以是任意数量的数据类型,例如uint,float,double,我无法弄清楚它是如何工作的。 据我所知,指针必须与它所代表的指针的类型相同。 值得注意的是openCV是一个C库,我的背景是C ++,所以我不知道如何在C中解决这些需要变量类型的问题。 例如,从学习OpenCV中获取的以下代码说明了我的困惑: void saturate_sv( IplImage* img ) { for( int y=0; yheight; y++ ) { uchar* ptr = (uchar*) ( img->imageData + y * img->widthStep ); for( int x=0; xwidth; x++ ) { ptr[3*x+1] = 255; ptr[3*x+2] = 255; } } } 这样可行,但是当我尝试对IPL_DEPTH_64F类型的iplImage进行操作并使用ptr [3 * x + 1] = 1时结果不正确。 […]

C中“short int”和“int”有什么区别?

C中的short int(或short)和int有何不同? 它们具有相同的尺寸和范围。 如果它们基本相同,那么有两种数据类型的用途是什么?

为什么int i = 400 * 400/400给出结果72,是数据类型为圆形?

我认为首先400 * 400 = 160000从0开始转换为28928并以循环方式转换为160000时为int类型(比如sizeof(int)= 2字节)假设它如下: 然后将28928除以400,其中得到72,结果随变量的类型而变化。 我的假设是正确的还是有其他解释?