Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的unsigned是否执行任何内部作业?_C_Unsigned - Fatal编程技术网

C中的unsigned是否执行任何内部作业?

C中的unsigned是否执行任何内部作业?,c,unsigned,C,Unsigned,自从我开始用C语言编程已经有一段时间了,但是,我仍然对无符号感到困惑。如果我们编译此代码: #include <stdio.h> int main(int argc, char **argv) { unsigned int x = -1; return 0; } #包括 int main(int argc,字符**argv) { 无符号整数x=-1; 返回0; } gcc和VC++在使用带未签名的的负数时不会产生任何错误,甚至不会发出警告 我的问题是,unsi

自从我开始用C语言编程已经有一段时间了,但是,我仍然对
无符号
感到困惑。如果我们编译此代码:

#include <stdio.h>

int main(int argc, char **argv)
{
    unsigned int x = -1;

    return 0;
}
#包括
int main(int argc,字符**argv)
{
无符号整数x=-1;
返回0;
}
gcc和VC++在使用带
未签名的
的负数时不会产生任何错误,甚至不会发出警告


我的问题是,
unsigned
是否执行任何内部作业,或者它只是一个提示程序该值不应为负值?

尝试通过以下方式在gcc中启用警告:
gcc-Wall-o out input.c


unsigned int
和普通
int
之间的另一个区别是:
int
使用4个字节的范围:2147483648到2147483647;
unsigned
使用4个字节的范围:0到4294967295。您不必存储有关符号的信息(最高位),这样就可以分配更大的值,应用程序将正常工作。

尝试通过以下方式在gcc中启用警告:
gcc-Wall-o out input.c


unsigned int
和普通
int
之间的另一个区别是:
int
使用4个字节的范围:2147483648到2147483647;
unsigned
使用4个字节的范围:0到4294967295。您不必存储有关符号(最高位)的信息,这样就可以分配更大的值,应用程序将正常工作。

这不仅仅是一个提示。以下两个代码段的行为应该不同:

签名整数:

int x = -1;
printf("%d\n", x > 0);  // prints 0
unsigned int x = -1;
printf("%d\n", x > 0);  // prints 1
无符号整数:

int x = -1;
printf("%d\n", x > 0);  // prints 0
unsigned int x = -1;
printf("%d\n", x > 0);  // prints 1

你可能会再举5个例子来说明签名的重要性。例如,使用
>
操作符向右移动。

这不仅仅是一个提示。以下两个代码段的行为应该不同:

签名整数:

int x = -1;
printf("%d\n", x > 0);  // prints 0
unsigned int x = -1;
printf("%d\n", x > 0);  // prints 1
无符号整数:

int x = -1;
printf("%d\n", x > 0);  // prints 0
unsigned int x = -1;
printf("%d\n", x > 0);  // prints 1

你可能会再举5个例子来说明签名的重要性。例如,使用
>
运算符右移。

内部(机器级)指令有符号和无符号版本,用于计算乘法
mul
(无符号)和
imul
(有符号)。编译器在将变量声明为无符号或有符号时选择它们。

用于计算的内部(机器级)指令有符号和无符号版本,例如乘法
mul
(无符号)和
imul
(有符号)。编译器在您将变量声明为无符号或有符号时选择它们。

使用
-Wsign conversion
获得带有
gcc
的警告

对于
gcc
4.7.1,
-Wsign转换既不是
-Wall
的一部分,也不是
-Wextra
的一部分


还请注意,C标准不需要此初始化警告。

使用
-Wsign conversion
获得带有
gcc
的警告

对于
gcc
4.7.1,
-Wsign转换既不是
-Wall
的一部分,也不是
-Wextra
的一部分


还请注意,C标准不要求对此初始化发出警告。

无符号
会影响整数溢出、比较和按位移位行为。它不仅仅是一个不应为负的“提示”。

无符号
会影响整数溢出、比较和按位移位行为。它不仅仅是一个不应该是负数的“提示”。

unsigned
不是像
static
extern
const
inline
那样的限定符。它是类型的一部分

int
unsigned int
是两种完全不同的类型。您将永远找不到可以容纳负数的
无符号int
。还要注意,
int
signed int
是完全相同的类型。对于
char
,这是一个稍微不同的故事,但我将把它留到另一个时间


-1
赋值给无符号整数是将其设置为可容纳的最大值的常见技巧。

无符号
不是像
静态
外部
常量
内联
那样的限定符。它是类型的一部分

int
unsigned int
是两种完全不同的类型。您将永远找不到可以容纳负数的
无符号int
。还要注意,
int
signed int
是完全相同的类型。对于
char
,这是一个稍微不同的故事,但我将把它留到另一个时间

-1
赋值给无符号整数是将其设置为最大值的常用技巧。

((无符号int)-1)
相当于
(UINT_MAX)
),因为从负值到无符号值的转换保证由模运算完成

C11§6.3.1.3有符号和无符号整数

2否则,如果新类型为无符号
,则该值将通过 重复地加上或减去一个大于最大值 可以在新类型中表示,直到值在 新型的

((unsigned int)-1)
相当于
(UINT_MAX)
),因为从负值到无符号值的转换保证由模运算完成

C11§6.3.1.3有符号和无符号整数

2否则,如果新类型为无符号
,则该值将通过 重复地加上或减去一个大于最大值 可以在新类型中表示,直到值在 新型的


显然,您在编译时未启用任何优化。请提高警告级别。MSVC对此确实有警告,但它需要
/W4
,我相信GCC也有警告。-Wall-pedantic没有显示任何关于