2013-02-15 36 views
10

Hành vi được xác định trong C cho UINT_MAX + 1u là gì? Làm thế nào an toàn là giả sử nó là số không?UINT_MAX + 1 bằng cái gì?

+3

@JoshPetitt : Đó là bằng không. 'UINT_MAX + 1u' được đánh giá là một số nguyên không dấu, dẫn đến' 0', sau đó được lưu trữ trong một 'long long'. ;-) – netcoder

+0

@netcoder, trên máy tính Windows 64 bit của tôi, bạn thực sự là chính xác. Trình biên dịch nội bộ của tôi là thiếu sót. :-) –

Trả lời

21

Từ tiêu chuẩn (C11, 6.2.5/9, tôi nhấn mạnh):

[...] Một tính toán liên quan đến toán hạng unsigned thể không bao giờ tràn, vì một kết quả mà không thể được đại diện bởi loại số nguyên không dấu kết quả là giảm modulo số lớn hơn giá trị lớn nhất có thể là được biểu thị bằng loại kết quả.

Nếu UINT_MAX10:

(10 + 1) % (10 + 1) == 0 

Vì vậy, vâng, nó an toàn để giả định đó là zero.

+9

Các nhiệm vụ tiêu chuẩn 'UINT_MAX' (và giá trị tối đa của các loại số nguyên không dấu khác) là' 2^N - 1', trong đó 'N' là chiều rộng của loại, vì vậy 10 là một ví dụ xấu (nhưng điều đó không ' t ngăn tôi từ bỏ phiếu). –

+1

2^3.4594316186372973 - 1 – Vortico

+0

Ngoài ra, '(chưa ký) -1 == UINT_MAX'; sau này có thể được sử dụng trong điều kiện tiền xử lý, trong khi '(unsigned) -1' chỉ có thể được đánh giá bởi trình biên dịch. – Loic

5

An toàn. Tiêu chuẩn C đảm bảo rằng số nguyên không dấu tràn kết quả xung quanh bằng không.

+2

Và C nghiêm chỉnh nói, số nguyên unsigned không bao giờ tràn chỉ tràn số nguyên đã ký. – ouah

+0

@ouah Trong trường hợp này, tôi nên nói gì? –

+1

@ H2CO3: bạn có thể nói họ quấn quanh. –

8

Đó là giá trị nhấn mạnh rằng trong khi unsigned hành vi được rõ ràng, integer overflow không phải là:

Trong ngôn ngữ lập trình C, có chữ ký số nguyên tràn nguyên nhân hành vi không xác định, trong khi tràn số nguyên không dấu gây ra số để giảm modu lo một sức mạnh của hai

Một bài báo rất tốt về đề tài này:

ví dụ về C/C++ INTEGER HOẠT ĐỘNG VÀ KẾT QUẢ CỦA HỌ

Expression    Result 
----------    ------ 
UINT_MAX+1    0 
LONG_MAX+1    undefined 
INT_MAX+1    undefined 
SHRT_MAX+1    SHRT_MAX+1 if INT_MAX>SHRT_MAX, otherwise undefined 
char c = CHAR_MAX; c++ varies 
-INT_MIN    undefined 
(char)INT_MAX   commonly -1 
1<<-1     undefined 
1<<0     1 
1<<31     commonly INT_MIN in ANSI C and C++98; undefined in C99 and C++11 
1<<32     undefined 
1/0     undefined 
INT_MIN%-1    undefined in C11, otherwise undefined in practice 
Các vấn đề liên quan