C++类型无符号长整型

22

unsigned long int在C++中是否等同于unsigned long

我认为它们是相同的。但是我见过一些人仍然在代码中使用unsigned long int,而我不明白为什么。以下是一个示例代码:

#include <stdio.h>

int main() {
    unsigned long int num = 282672; 
    int normalInt = 5;
    printf("");
    return 0;
}
5个回答

27

是的。

long 只是 long int 的简写。这是因为原则上 long 只是一个限定符(例如,它也可以用于延长 double 数据类型)

从 C++ ISO 标准第 7.1.5.2 节,等效类型说明符表:

enter image description here


1
我看到你的表格中每种类型都省略了 signed 标记,除了字符类型。这是有意为之还是表格中的错误? - Rik Schaaf
1
不,这不是错误。请参见https://dev59.com/yXI95IYBdhLWcg3w_zas#2054941和https://dev59.com/pnVD5IYBdhLWcg3wI3-L#87648。 - Sebastian
@RikSchaaf - 不,这不是一个错误。标准规定charsigned还是unsigned类型是由实现定义的。事实上,char实际上是与unsigned charsigned char都不同的一种类型。这与所有其他整数类型不同,它们默认是signed类型,除非使用了unsigned关键字。 - Peter
@Sebastian 很有趣的了解。我阅读了两个问题的答案和评论,以了解它们存在的原因。感谢您的澄清。 - Rik Schaaf

4
C99标准的§6.7.2节列出了以下类型列表(仅摘录):
  • shortsigned shortshort intsigned short int
  • unsigned shortunsigned short int
  • intsignedsigned int
  • unsignedunsigned int
  • longsigned longlong intsigned long int
  • unsigned longunsigned long int
  • long longsigned long longlong long intsigned long long int
  • unsigned long longunsigned long long int

另外还有以下内容:

(5) 逗号分隔的每个集合指定相同的类型,但是对于位字段,实现可定义说明符是指代与相同的类型还是与相同的类型。


虽然这是一个C++问题 ;) - Sebastian Mach
1
是的,这是一个包含了 stdio.h 并使用了 printf 的 C++ 问题 ;) - Hristo Iliev
有时候,我只看标签,有时候只看代码,也会陷入这种情况 :D - Sebastian Mach
问题已经标记为C和C++。 - Peter
最初并没有这个C标签,它是在一年多之后添加的。 - Hristo Iliev

1

是的unsignedsignedshortlonglong long 都是用于 XXX int 的简单类型说明符。

请参阅标准中的 7.1 Specifiers [dcl.spec]

3 [注意:由于 signed、unsigned、long 和 short 默认情况下都意味着 int,因此出现在这些限定符之后的类型名称被视为正在(重新)声明该名称。[示例:

void h(unsigned Pc); // void h(unsigned int)

void k(unsigned int Pc); // void k(unsigned int)

—end example ] —end note ]

以及 7.1.6.2 Simple type specifiers [dcl.type.simple]

    Table 10 — simple-type-specifiers and the types they specify

    Specifier(s)            | Type
    ------------------------+---------------------------------
    type-name               | the type named
    simple-template-id      | the type as defined in 14.2
    char                    | “char”
    unsigned char           | “unsigned char”
    signed char             | “signed char”
    char16_t                | “char16_t”
    char32_t                | “char32_t”
    bool                    | “bool” 
    unsigned                | “unsigned int”
    unsigned int            | “unsigned int”
    signed                  | “int”
    signed int              | “intint                     | “int”
    unsigned short int      | “unsigned short int”
    unsigned short          | “unsigned short int”
    unsigned long int       | “unsigned long int”
    unsigned long           | “unsigned long int”
    unsigned long long int  | “unsigned long long int”
    unsigned long long      | “unsigned long long int”
    signed long int         | “long int

0

unsigned long int 是正确的类型定义,但可以忽略 int


long unsignedint long unsigned 都表示无符号长整型。 - Keith Thompson

0

是的,它们是相同的。说 unsigned long int 只是明确地说明它是一个 int。

您可以通过 sizeof(unsigned long int)sizeof(unsigned long) 查看类型的大小。

希望这有所帮助。


我不确定你所说的“明确声明它是int”的意思。unsigned long intint是两种不同的类型。int既是关键字,也是一种类型的名称;而名称unsigned long int使用了关键字int,但并不指代类型int - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接