相关疑难解决方法(0)

签署C中的无符号转换 - 它总是安全吗?

假设我有以下C代码.

unsigned int u = 1234;
int i = -5678;

unsigned int result = u + i;
Run Code Online (Sandbox Code Playgroud)

什么隐式转换在这里怎么回事,这是代码为安全的所有值ui?(安全,从某种意义上说,即使此示例中的结果会溢出到某个巨大的正数,我也可以将其转换回int并获得真实的结果.)

c type-conversion

127
推荐指数
3
解决办法
16万
查看次数

为什么负int大于unsigned int?

int main(void) 
{ 
     unsigned int y = 10; 
     int x = – 4; 
     if (x > y) 
        Printf("x is greater");
     else 
        Printf("y is greater"); 
     getch(); 
     return (0); 
} 

Output: x is greater
Run Code Online (Sandbox Code Playgroud)

我认为输出y会更大,因为它是无符号的.这背后的原因是什么?

c int unsigned signed

41
推荐指数
2
解决办法
9432
查看次数

了解C中的积分算术

编辑:将void *修改为uint8_t *值。问题仍然存在。编辑:问题是一个简单的变量溢出,与整数提升无关。

我解决了该简化代码中的一个错误。类型与原始源代码中的类型相同。

unsigned int entrySize;    // entrySize is 288
int startIndex, endIndex;  // both are 24536838
uint8_t *pStartAddr;          // valid initialized pointer (0x34f1e40)

/*Mystery begins...*/
uint8_t *curr_addr = pStartAddr + entrySize * startIndex;
while (curr_addr <= startAddr + entrySize * endIndex)
{
    externFunc(curr_addr);
    curr_addr+=entrySize;
}
Run Code Online (Sandbox Code Playgroud)

乍一看,此代码似乎很明显,不包括奇怪的类型选择。

但是,在我们的一次崩溃中,似乎curr_addr获得了无效的指针。我的直觉是存在一个问题,entrySize * startIndex因为它们的乘法设置在第32位,并且具有startIndexendIndex作为符号类型可能会使编译器使用所需的值感到困惑。

在更改了他们的类型之后,问题就解决了。但我无法弄清楚到底是什么问题。

我正在使用64位计算机,x86_64 CPU,gcc(GCC)4.8.5 20150623和linux red hat发行版(版本4.8.5-28)

我以为上面的计算在的第32位设置时开始出现问题entrySize * startIndex。但是,当我使用第startIndex32位打开的第一个值时,它仍然有效。它也显示

我的问题是:

  • int* 的值结果unsigned int …

c types integer-overflow

2
推荐指数
1
解决办法
92
查看次数

标签 统计

c ×3

int ×1

integer-overflow ×1

signed ×1

type-conversion ×1

types ×1

unsigned ×1