Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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++ 静态无符号整数foo和更高版本if(foo>;0)?_C++_C_Int - Fatal编程技术网

C++ 静态无符号整数foo和更高版本if(foo>;0)?

C++ 静态无符号整数foo和更高版本if(foo>;0)?,c++,c,int,C++,C,Int,书中写道: static unsigned int foo; 后来 if( foo > 0) { 是错误的,它将导致一个难以发现的错误。 为什么呢 在x86汇编语言编程中,有符号算术指令和 还有无符号算术指令, JG JL这个问题不应该在汇编程序级别上回答,而应该在c/c++语言级别上回答。在大多数体系结构上,不可能比较有符号和无符号数字,而c/c++不便于进行这种比较。相反,有一些规则是关于将一个操作数转换为另一个操作数的类型以进行比较的——例如,请参见ASWER to 与文字比较—

书中写道:

static unsigned int foo;
后来

if( foo > 0)
{
是错误的,它将导致一个难以发现的错误。 为什么呢

在x86汇编语言编程中,有符号算术指令和 还有无符号算术指令,
JG JL这个问题不应该在汇编程序级别上回答,而应该在c/c++语言级别上回答。在大多数体系结构上,不可能比较有符号和无符号数字,而c/c++不便于进行这种比较。相反,有一些规则是关于将一个操作数转换为另一个操作数的类型以进行比较的——例如,请参见ASWER to

与文字比较——典型的做法(如你所做的)不是错误的,但你可以做得更好——根据C++标准:

2.13.1.1整数文字是一个没有句点的数字序列 或指数部分。整数文字可能有一个前缀,用于指定 它的基和指定其类型的后缀。词汇优先 数字序列中的数字是最重要的。小数点 整数文字(以10为基数)以0和con以外的数字开头- 由一系列十进制数字组成。八进制整数文字(基) 8)以数字0开始,由八进制序列组成 数字.22)十六进制整数文字(以十六进制为基数)以0x开头 或0X,由十六进制数字序列组成,其中包括 十进制数字和字母a到f以及a到f 十进制值从10到15。[示例:数字12可以是 书面12、014或0XC。]

2.13.1.2整型文字的类型取决于其形式、值、, 和后缀。如果它是十进制且没有后缀,则它具有 可以表示其值的类型有:int、long int;如果 该值不能表示为long int,行为为 未定义。如果它是八进制或十六进制且没有后缀,则它的值可以表示为以下类型中的第一种:int, unsigned int,long int,unsigned long int.如果后缀为u或 U、 它的类型是第一个可以定义其值的类型 repre-sented:unsigned int,unsigned long int.如果后缀为l 或者L,它的类型是第一个可以定义其值的类型 表示:长整型,无符号长整型。如果后缀为ul,lu, uL、Lu、uL、Lu、uL或Lu,其类型为无符号长整型

如果您想确定您的文字类型(以及comaprison类型),请添加描述的后缀以确保文字类型正确

还值得注意的是,literal
0
实际上不是十进制而是八进制-它似乎没有改变任何东西,但这是非常意外的-或者我错了


总而言之,编写这样的代码并没有错,但您应该记住,在中的某些情况下,可能会表现出违反直觉的行为(或者至少是违反数学的行为)。

关于文字
0
,是的:6.4.4.1第1段定义了
八进制常数:0;八进制常数八进制数字
所以普通的
0
应该是八进制常数而不是十进制常数。当然,这并不重要。