Tag: 转换

赋值使得指针来自int w / out of cast

我正在为一个记忆斐波那契数字的程序编译一些代码。 该程序工作正常但是当我在linux环境中编译时,我在编译之前得到了这个警告。 line 61: warning: assignment makes pointer from integer without a cast [enabled by default] 以下是此警告来自的代码片段,我将尝试展示最相关的内容,以便了解最佳情况 int InitializeFunction(intStruct *p, int n) p->digits = (int)malloc(sizeof(int) * 1); if(p->digits == NULL) handleError(“Got error”); //making the one index in p->digits equal to n p->digits[0] = n; //incrementing a field of ‘p’ p->length++; //return 1 if successful return […]

字节在C中签名int

我有一个二进制值存储在C中的char中,我希望将此字节转换为C中的signed int。目前我有这样的事情: char a = 0xff; int b = a; printf(“value of b: %d\n”, b); 标准输出的结果为“255”,所需的输出为“-1”。

将指向较大结构的指针转换为指向较小结构的指针

这篇文章将以此为基础,但将更加通用。 通常我会看到指向大型结构的指针被转换为指向较小结构的指针,我认为这是有效的,因为指针只是结构中第一个字节的地址。 我还有一个问题是,当大多数方法没有指向他们期望的类型时,如何处理指针。 我将使用Socket API作为示例: sockaddr_storage比sockaddr但是指向sockaddr指针会被转换为指向sockaddr指针,然后才会传递给sockaddr这样的函数 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 因此,当指针指向比预期更大的结构时,如何处理函数。 他们说 “哦,传给我的大小( socklen_t addrlen )比我想象的要大。最好把这个指针扔回sockaddr_storage !” 然后像这样访问其成员? 或者他们做了更复杂的事情?

编译器在转换整数常量时有什么作用?

使用以下宏: #define MIN_SWORD (signed int) 0x8000 例如,以下表达式: signed long s32; if (s32 < (signed long)MIN_SWORD)… 预计会做以下检查: if (s32 < -32768) 一些编译器似乎工作正常。 但在其他一些编译器上,exprssion被评估为: if (s32 < 32768) 我的问题:ANSI-C编译器如何评估以下表达式:( (signed long) (signed int) 0x8000 ? 似乎在某些编译器上,转换为`(signed int)不会导致(预期)从正常数0x8000转换为有符号整数的最小负值,如果之后表达式被转换为更宽泛的有符号长整型。 换句话说,评估的常量不等于:-32768L(但32768L) 这种行为可能是ANSI-C未定义的吗?

处理双重间接时避免不兼容的指针警告

假设这个程序: #include #include static void ring_pool_alloc(void **p, size_t n) { static unsigned char pool[256], i = 0; *p = &pool[i]; i += n; } int main(void) { char *str; ring_pool_alloc(&str, 7); strcpy(str, “foobar”); printf(“%s\n”, str); return 0; } ……有可能以某种方式避免GCC警告 test.c:12: warning: passing argument 1 of ‘ring_pool_alloc’ from incompatible pointer type test.c:4: note: expected ‘void **’ […]

为什么不从返回int32_t的函数返回0x80000000导致警告?

考虑: int32_t f() { return 0x80000000; } 为什么不会导致编译器警告(至少在GCC上)? 0x80000000超出int32_t的范围( INT32_MAX为0x7fffffff )。 我相信这应该导致一个隐含的演员 – 这是正确的吗? 进一步的评论: if (f() == 0x80000000) foo(); 以上原因导致GCC没有任何警告。 然而 int32 ret = f(); if (ret == 0x80000000) baz(); 导致“警告:有符号和无符号整数表达式之间的比较”。 我相信这是因为0x80000000的类型为unsigned int因为它超出了int的范围。 那是对的吗? 假设我的假设都不对,为什么第一次比较不会引起警告?

在C中有替代strtoull()函数吗?

我需要将char*转换为unsigned long long int并且在C标准库中有一个名为strtoull()的函数,但它需要很长时间。 我需要在char*和unsigned long long int之间快速转换。 如何编写比标准转换function更快的转换function?

将NULL转换为C中的结构指针?

在C中向结构指针转换NULL有什么好处吗? 例如: typedef struct List { …. } List; List *listPtr = ((List *) NULL) ; PostgreSQL源代码示例: #define NIL ((List *) NULL) http://doxygen.postgresql.org/pg__list_8h_source.html

如何从C中的“原始”内存中读取/写入类型值?

我如何制作这样的作品呢? void *memory = malloc(1000); //allocate a pool of memory *(memory+10) = 1; //set an integer value at byte 10 int i = *(memory+10); //read an integer value from the 10th byte

浮动整数铸造?

我知道浮点数不能完全代表每个数字,因此必然会发生一些错误。 但最近我遇到了一个问题,我没有得到正确的解释。 请逐步解释转换如何影响输出。 截断小数位如何给我错误的答案? #include #include #include int main() { int x; int y = 0; int n = 0; printf(“Enter The Number You Want To Octal Equivalent Of : “); scanf(“%d”,&x); while(x>0) { y = y + (x%8)*pow(10,n); printf(“%d\n” , y); x = x/8 ; n = n + 1; } printf(“Octal Equivalent is […]