我是C新手,见过(unsigned)b
这是否意味着b将是一个无符号int?或者它意味着什么类型?
最佳答案
b
将是任何类型的开始。这没变(unsigned)b
将计算为b
的任何值,但这取决于转换为unsigned
,它是unsigned int
的同义词。
这完全取决于开始的b
类型,该类型是否可以转换为unsigned int
,其中包含的值是否在0...UINT_MAX
之间毫发无损。
前任:
#include <stdio.h>
void foo(unsigned int x)
{
printf("%u\n", x);
}
int main()
{
int b = 100;
foo((unsigned)b); // will print 100
char c = 'a';
foo((unsigned)c); // will print 97 (assuming ASCII)
short s = -10; // will print 4294967286 for 32-bit int types
// (see below for why)
foo((unsigned)s);
// won't compile, not convertible
//struct X { int val; } x;
//foo((unsigned)x);
}
唯一能让你眉开眼笑的就是第三个例子。当可转换类型到无符号类型的值超出无符号类型的范围时(例如:负值与任何
unsigned
目标类型所表示的值不同),该值通过重复添加由无符号目标加上一个表示的最大值到超出范围值来转换,直到它落入无符号类型的有效范围内。换言之,由于
-10
不在unsigned int
的有效表示范围内,因此将UINT_MAX+1
重复添加到-10
中(在这种情况下只需要一次),直到结果在0...UINT_MAX
范围内。希望能有所帮助。