Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Breaking Change] Generic math shifts should use the appropriate mask #43303

Open
tannergooding opened this issue Nov 4, 2024 · 1 comment
Open
Assignees
Labels
breaking-change Indicates a .NET Core breaking change Pri3 ⌚ Not Triaged Not triaged

Comments

@tannergooding
Copy link
Member

Description

Introduced with dotnet/runtime#103900

Version

.NET 10 Preview 1

Previous Behavior

The behavior when utilizing generic math to perform a shift on a T could differ based on the type. In some case it would appropriately mask the shift amount by sizeof(T) - 1 and in other cases it would do no masking. This meant that "overshifting" (such as shifting a byte by 8) could result in different answers being produced than expected.

New Behavior

The implementations were updated to mask the shift amount, as appropriate, to ensure consistent behavior across all built-in integer types and with the behavior documented by the IShiftOperators interface.

Reason for change

The behavior differed from the designed behavior due to a difference in how masking works for small integer types in C#.

Feature Area

Numerics

Affected APIs

operator <<, operator >>, and operator >>> for byte, char, sbyte, short, and ushort when used via Generic Math, which requires a T constrained to where T : IShiftOperators<T, int, T> or a similar interface.

@dotnetrepoman dotnetrepoman bot added the ⌚ Not Triaged Not triaged label Nov 4, 2024
@tannergooding tannergooding added breaking-change Indicates a .NET Core breaking change and removed ⌚ Not Triaged Not triaged Pri3 labels Nov 4, 2024
@dotnetrepoman dotnetrepoman bot added the ⌚ Not Triaged Not triaged label Nov 4, 2024
@skyoxZ
Copy link

skyoxZ commented Nov 8, 2024

A small correct: The mask was 31 (not no mask) because they were converted to int.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breaking-change Indicates a .NET Core breaking change Pri3 ⌚ Not Triaged Not triaged
Projects
Development

No branches or pull requests

3 participants