Tag: 类型

在C中区分typedef的类型/标签名称有什么好处?

一些代码库为tag和type使用不同的标识符,例如: typedef struct _foo { int bar; } foo; 代替: typedef struct foo { int bar; } foo; 这里将详细解释这些差异: C ++中’struct’和’typedef struct’之间的区别? (注意,这个问题是关于C的,并且链接是一个C ++问题,所以我假设该答案的基础也适用于C,尽管可能不是这种情况,或者可能存在一些细微差别) 。 我的问题是: 对类型名称空间和全局名称空间使用不同的标识符有什么实际优势 (如果有的话) ? 是否有充分的理由去做另一个? (在某些条件下).. 或者这只是一个惯例?

C多种类型的function

我想在C中编写一些函数,但它们必须适用于所有数字类型(int,float,double)。 什么是好习惯? 在void上使用指针(当然还有指向函数的指针)? 或者为每种类型写一个不同的function? 例如: float func(float a, float b) { return a+b; }

有符号和无符号,以及C中的位扩展如何工作

unsigned short s; s = 0xffff; int i = s; 扩展如何在这里工作? 添加了2个更大的顺序字节,但我很困惑1或0是否在那里扩展。 这可能与平台有关,所以让我们关注Unix的作用。 int的两个更大的顺序字节是用1还是0填充,为什么? 基本上,计算机是否知道s是无符号的,并且正确地将0分配给int的高阶位? 所以i现在是0x0000ffff ? 或者因为ints是在unix中默认签名的,它是从s (a 1)获取有符号位并将其复制到更高阶的字节?

存储(和打印)整数的最大数据类型是什么?

在32位系统的C中,哪种数据类型将存储(并因此可以打印)最大的整数? 是long long还是unsigned long ? 有没有unsigned long long ? 哪个是最精确和政治正确的?

当单个精度浮点数大约为零时,它的近似分辨率是多少

我存储了许多经度和纬度作为doubles ,我想知道我是否可以将它们存储为floats 。 要回答这个问题,当存储的值是经度/纬度(-180到+180)时,我需要知道单精度浮点数的近似分辨率。

签署了二进制补码算法

我正在考虑数据类型范围,出现了一个问题。 我们知道签名char的范围是从-128到127.我得到了127的结果,即0111111 = +127 但我无法得到-128如何来? 如果我们只是ON符号位,我们得到11111111,它是如何等于-128?

字符串文字是否在C中编译时自动转换为char *?

如果我要做的事情如下: printf(“The string is: %s\n”, “string1”); 在编译时完成以下操作: printf(“The string is: %s\n”, (unsigned char*) “string1”); 还是类似的?

了解C中的双精度运算

我想了解为什么这段代码: double r,d,rc; scanf(“%lf %lf”, &r, &d); rc = (r * r) – (d/2) * (d/2); printf(“%.2f\n”, M_PI * rc); 返回比这个更精确的结果(没有rc变量赋值): double r,d,rc; scanf(“%lf %lf”, &r, &d); printf(“%.2f\n”, M_PI * (r * r) – (d/2) * (d/2)); 另一个相关的问题:为什么n * n比pow(n,2)更好?

检查一个整数类型的值是否适合另一个整数类型

Type1和Type2有两种类型,由不同的头提供,对于某些整数类型都是typedef,但不知道哪些(并且可能在编译器,操作系统等方面有所不同)。 该程序是否保证正常工作(如果它编译) Type1 a = …; if (a == (Type2) a) { printf(“a fits into Type2”); else { printf(“a doesn’t fit into Type2”); } 或者是否有我不考虑的角落案件?

从(char *)到(int *)的引用解引用在此示例中未被理解

我正在网站上对C进行练习测试,我碰巧看到了这个问题。 我的疑问在评论中有解释,所以请阅读它们。 #include int main() { int arr[3] = {2, 3, 4}; // its assumed to be stored in little-endian ie; // 2 = 00000010 00000000 00000000 00000000 // 3 = 00000011 00000000 00000000 00000000 // 4 = 00000100 00000000 00000000 00000000 char *p; p = arr; p = (char*)((int*)(p)); printf(“%d “, *p); p = […]